LANG SELRCT

Apps Script Reference  (Create: Create new Spreadsheet | Create new Apps Script

Tuesday, April 30, 2019

idを指定して要素を削除したい .remove()


これで削除できる

document.getElementById(id).remove();


マウスの座標をリアルタイムで取得したい(e.pageX, e.pageY)


マウスのポインタの位置をリアルタイムで取得したい

デモ





コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile("index");
}
意訳
この機能がやること
指定したHTMLファイルを表示する




index.html
<!DOCTYPE html>
<html>
<body>
  <label>X</label><input type="text" id="posX">
  <br>
  <label>Y</label><input type="text" id="posY">
<script>
window.onmousemove = mousePos;
 
function mousePos(e) {
  document.getElementById("posX").value = e.pageX;
  document.getElementById("posY").value = e.pageY;
}
</script>
</body>
</html>
意訳
 


X座標のラベルとテキストボックス
改行
Y座標のラベルとテキストボックス

マウスが動いたらmousePosを実行する

この機能がやること
idがposXの要素にX座標の数値を入れる
idがposYの要素にY座標の数値を入れる






Googleドライブ内のフォルダをフォルダ名で並べ替えて取得したい


Googleドライブ内のファイルをファイル名で並べ替えて取得したい
のフォルダ版

特定のフォルダ内のフォルダをフォルダ名で並べ替えます



コード.gs
/************************************
フォルダ内のフォルダを取得して
フォルダ名で昇順に並べ替えて
フォルダ名とIDの配列を返す
************************************/
function getFolderArray() {
  var parentFolderId = "ID";
  var folderArray = [];
  var folders = getFolders(parentFolderId);
  for(var i = 0; i < folders.length; i++) {
    var name = folders[i]['name'];
    var id = folders[i]['id'];
    folderArray.push([name, id]);
  }
  Logger.log(folderArray);
}

/************************************
フォルダ内のフォルダを取得して
昇順にして返す
************************************/
function getFolders(parentFolderId) {
  var folderProps = [];
  var parentFolder = DriveApp.getFolderById(parentFolderId);
  var contents = parentFolder.getFolders();
  while(contents.hasNext()) {
    var folder = contents.next();
    var name = folder.getName();
    var id = folder.getId();
    var obj = {};
    obj["name"] = name;
    obj["id"] = id;
    folderProps.push(obj);
  }
  var sorted = objSort(folderProps);
  return folderProps;
}

/************************************
並べ替える
************************************/
function objSort(fileProps) {
  var ascending = fileProps.sort(asc);
  return ascending;
}

/************************************
nameで昇順に並べ替える
************************************/
function asc(a, b){
  var A = a.name;
  var B = b.name;
  if(A > B){
    return 1;
  }else if(A < B ){
    return -1;
  }else{
   return 0;
  }
}



正規表現で英数以外のテキストの間にある半角スペースを削除したい


今回試した正規表現

/(?<![a-zA-Z0-9!?])[\s ](?![a-zA-Z0-9])/g



Good morning! お は よ!



Good morning! おはよ!

にする



コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile("index");
}
意訳
この機能がやること
指定したHTMLファイルを表示する




index.html
<!DOCTYPE html>
<html>
<body>
<script>
myFunction();
function myFunction() {
  var text = 'Good morning! お は よ!';
  text = text.replace(/(?<![a-zA-Z0-9!?])[\s ](?![a-zA-Z0-9!?])/g, "");
  console.log(text);
}
</script>
</body>
</html>



補足

.gs側では「SyntaxError: 量指定子 ? は無効です。」と出て ? は使えないようなので、.htmlでやっています。


テキスト画像をOCR化したときに改行が半角スペースになることがあり、その半角スペースを消したくて書きました。


var text = 'Good morning! お は よ!';
text = text.replace(/(?<![a-zA-Z0-9])[\s ](?![a-zA-Z0-9])/g, "");

=> Good morning!おはよ!

これだと ! のあとの半角スペースも消えるので


!と?も対象にして

/(?<![a-zA-Z0-9!?])[\s ](?![a-zA-Z0-9])/g,

としたのが今回試した正規表現です。


Monday, April 29, 2019

Googleドライブの特定のフォルダに新規フォルダを作成したい


一発でやる方法がわからないのでシートでやったときと同じ手順で

  1. マイフォルダの中に作成して
  2. 特定のフォルダの中に追加して
  3. マイフォルダの中から削除する




コード.gs
var TARGET_FOLDER_ID = "ID";

function createFolder() {
  var newFolder = DriveApp.createFolder('New Folder');
  var folderId = newFolder.getId();
  addFolder(folderId)
  removeFolder(folderId);
}

function addFolder(folderId) {
  var folder = DriveApp.getFolderById(folderId);
  var targetFolder = DriveApp.getFolderById(TARGET_FOLDER_ID);
  targetFolder.addFolder(folder);
}

function removeFolder(folderId){
  var folder = DriveApp.getFolderById(folderId);
  var parentFolder = folder.getParents().next();
  parentFolder.removeFolder(folder);
}



Googleドライブのフォルダ内でファイル名が一致するドキュメントのテキストを取得したい


Googleドライブのフォルダ内のドキュメントからテキストを取得したい(並べ替える)
ではフォルダ内のすべてのファイルを対象にしましたが

ここでは
フォルダ内に存在するすべてのファイルを取得してから
その中でファイル名が一致するものだけを抽出する

というコードを書きました


以下の変数内の値は各自で設定します
  • folder の ID
  • files のファイル名を特定する文字列

コード.gs
function getFilesBySearch0() {
  var folder = DriveApp.getFolderById("ID");
  var files = folder.searchFiles('title contains "ファイル名を特定する文字列"');
  
  var fileProps = [];
  while (files.hasNext()) {
    var file = files.next();
    var id = file.getId();
    var name = file.getName();
    var text = getDocText(id);
    var obj = {}
    obj['id'] = id;
    obj['name'] = name;
    obj['text'] = text;
    fileProps.push(obj);
  }
  objSort(fileProps);
  Logger.log(fileProps);
  console.log(fileProps);
}

/************************************
ドキュメントのテキストを取得する
************************************/
function getDocText(id) {
  var doc = DocumentApp.openById(id);
  var text = doc.getBody().getText();
  return text;
}

/************************************
並べ替える
************************************/
function objSort(fileProps) {
  var ascending = fileProps.sort(asc);
  return ascending;
}

/************************************
nameで昇順に並べ替える
************************************/
function asc(a, b){
  var A = a.name;
  var B = b.name;
  if(A > B){
    return 1;
  }else if(A < B ){
    return -1;
  }else{
   return 0;
  }
}



補足

フォルダ内のファイル数が多いとその分時間がかかります


関連記事
Googleドライブ内の特定のフォルダ内でファイルを探したい(スクリプトで)
Googleドライブのフォルダ内のドキュメントからテキストを取得したい(並べ替える)

Googleドライブのフォルダ内のドキュメントからテキストを取得したい(並べ替える)


Googleドライブのフォルダ内のドキュメントからテキストを取得したい
ではシンプルに取得するコードを書きたくて並べ替えまではやりませんでしたが、ここでは並び替えるところまで書きました。



コード.gs
/************************************
フォルダ内のファイルを取得して
ファイル名で昇順に並べ替えて
ファイルIDたちの配列を返す
************************************/
function getFileArray() {
  var folderId = "ID";
  var fileArray = [];
  var files = getFiles(folderId);
  for(var i = 0; i < files.length; i++) {
    var name = files[i]['name'];
    var id = files[i]['id'];
    var text = files[i]['text'];
    fileArray.push([name, id, text]);
  }
  Logger.log(fileArray);
}

/************************************
フォルダ内のファイルを取得して
昇順にして返す
************************************/
function getFiles(folderId) {
  var fileProps = [];
  var folder = DriveApp.getFolderById(folderId);
  var contents = folder.getFiles();
  while(contents.hasNext()) {
    var file = contents.next();
    var name = file.getName();
    var id = file.getId();
    var text = getDocText(id);
    var obj = {};
    obj["name"] = name;
    obj["id"] = id;
    obj["text"] = text;
    fileProps.push(obj);
  }
  var sorted = objSort(fileProps);
  return fileProps;
}

/************************************
ドキュメントのテキストを取得する
************************************/
function getDocText(id) {
  var doc = DocumentApp.openById(id);
  var text = doc.getBody().getText();
  return text;
}

/************************************
並べ替える
************************************/
function objSort(fileProps) {
  var ascending = fileProps.sort(asc);
  return ascending;
}

/************************************
nameで昇順に並べ替える
************************************/
function asc(a, b){
  var A = a.name;
  var B = b.name;
  if(A > B){
    return 1;
  }else if(A < B ){
    return -1;
  }else{
   return 0;
  }
}



関連記事
Googleドライブのフォルダ内のドキュメントからテキストを取得したい
Googleドライブ内のファイルをファイル名で並べ替えて取得したい

Googleドライブ内のファイルをファイル名で並べ替えて取得したい


Googleドライブのフォルダの中にいくつかファイルが入っていて

ファイル名を昇順で並び替えて、IDと一緒に配列に入れて

このように取得したい

[
  [日本語1, 1e0K3aBV5xxx],
  [日本語2, 1OYdKFXVqxxx],
  [英語1, 162f0ghDw63xxx],
  [英語2, 1xHV36sf4A5xxx]
]


ということを実現したくて書いたコードです


コード.gs
/************************************
フォルダ内のファイルを取得して
ファイル名で昇順に並べ替えて
ファイル名とIDの配列を返す
************************************/
function getFileArray() {
  var folderId = "ID";
  var fileArray = [];
  var files = getFiles(folderId);
  for(var i = 0; i < files.length; i++) {
    var name = files[i]['name'];
    var id = files[i]['id'];
    fileArray.push([name, id]);
  }
  Logger.log(fileArray);
}

/************************************
フォルダ内のファイルを取得して
昇順にして返す
************************************/
function getFiles(folderId) {
  var fileProps = [];
  var folder = DriveApp.getFolderById(folderId);
  var contents = folder.getFiles();
  while(contents.hasNext()) {
    var file = contents.next();
    var name = file.getName();
    var id = file.getId();
    var obj = {};
    obj["name"] = name;
    obj["id"] = id;
    fileProps.push(obj);
  }
  var sorted = objSort(fileProps);
  return fileProps;
}

/************************************
並べ替える
************************************/
function objSort(fileProps) {
  var ascending = fileProps.sort(asc);
  return ascending;
}

/************************************
nameで昇順に並べ替える
************************************/
function asc(a, b){
  var A = a.name;
  var B = b.name;
  if(A > B){
    return 1;
  }else if(A < B ){
    return -1;
  }else{
   return 0;
  }
}

意訳
 




この機能がやること
フォルダIDを指定して
配列を用意して
フォルダ内のファイルを取得して
ファイルの数だけ繰り返す
一つずつファイル名を取得して
IDも取得して
配列に追加して

ログに出す






この機能がやること
配列を用意して
ドライブの中のフォルダを取得して
フォルダ内のファイルを取得して
次のファイルがなくなるまで
次のファイルを取得して
ファイル名を取得して
ファイルIDを取得して
オブジェクトを用意して
nameを入れて
idを入れて
配列に追加する

並べ替えて
返す





この機能がやること
昇順で並べ替えて
返す





この機能がやること
引数の1つ目のnameを取得して
引数の2つ目のnameを取得して
AがBより大きければ
1を返して (A を B の後ろに並べる)
AがBより小さければ
-1を返して (A を B の前に並べる)
それ以外なら
0を返す(A と B の並びを変えない)






関連記事
Googleドライブで指定したフォルダ内にあるファイルidを取得したい


参考

Array​.prototype​.sort()

Googleドライブのフォルダ内のドキュメントからテキストを取得したい


この記事のコード.gsでやること

Googleドライブで
複数のドキュメントファイルが入ったフォルダがあって
そのフォルダIDを指定して
ドキュメントのテキストを配列で取得する


やらないこと
ファイル名で並べ替えることはここではやらない


並べ替えるコードはこちら



コード.gs
function getDocTexts() {
  var folderId = 'ID';
  var folder = DriveApp.getFolderById(folderId);
  var ids = getFileIds(folderId);
  var textArray = [];
  for(var i = 0; i < ids.length; i++) {
    var text = getDocText(ids[i]);
    textArray.push(text);
  }
  Logger.log(textArray);
}

function getDocText(id) {
  var doc = DocumentApp.openById(id);
  var text = doc.getBody().getText();
  return text;
}

function getFileIds(folderId) {
  var ids = [];
  var folder = DriveApp.getFolderById(folderId);
  var contents = folder.getFiles();
  while(contents.hasNext()) {
    var file = contents.next();
    var id = file.getId();
    ids.push(id);
  }
  return ids;
}



関連記事
Googleドライブで指定したフォルダ内にあるファイルidを取得したい

Googleドキュメントのテキストをプレーンテキストで取得したい


こういうドキュメントがあって
入力されているテキストをスクリプトで取得してログに出してみる


今回ドキュメントに書いたテキスト

Googleドキュメントのテキストを取得したい。
スクリプトでドキュメントを取得して、プレーンテキストにしてログに出してみる。



コード.gs
function getDocText() {
  var id = "1oMMKqivcIXq6etXJT-8Jq84RU-5Bt955_b3o9BCdGlQ";
  var doc = DocumentApp.openById(id);
  var body = doc.getBody().getText();
  Logger.log(body);
}
意訳
この機能がやること
ファイルIDを指定して
そのドキュメントを取得して
テキストを取得して
ログに出す




実行結果


参考

Document Service
https://developers.google.com/apps-script/reference/document/

Class DocumentApp
https://developers.google.com/apps-script/reference/document/document-app

Class Body
https://developers.google.com/apps-script/reference/document/body

getText()
https://developers.google.com/apps-script/reference/document/body#getText()

Sunday, April 28, 2019

JSON.stringify()で見やすいログを出したい


こういうオブジェクトがあって

var obj = {
    'id': 12345,
    'name': 'ooo',
    'email': 'ooo@gmail.com',
    'city': 'tokyo'
  }

以下のような3つのログを出してみる

ログ1:普通に出す
{"id":12345,"name":"ooo","email":"ooo@gmail.com","city":"tokyo"}


ログ2:スペースで字下げして見やすく出す
{ "id": 12345, "name": "ooo", "email": "ooo@gmail.com", "city": "tokyo" }


ログ3:name, emailだけを出す
{
 "name": "ooo",
 "email": "ooo@gmail.com"
}



ログ1:普通に出すコード.gs

コード.gs
function myFunction() {
  var obj = {
    'id': 12345,
    'name': 'ooo',
    'email': 'ooo@gmail.com',
    'city': 'tokyo'
  }
  var json = JSON.stringify(obj);
  Logger.log(json);
}


実行結果


ログ2:スペースで字下げして出すコード2.gs

コード2.gs
function myFunction() {
  var obj = {
    'id': 12345,
    'name': 'ooo',
    'email': 'ooo@gmail.com',
    'city': 'tokyo'
  }
  var space = 2;
  var json = JSON.stringify(obj, null, space);
  Logger.log(json);
}


実行結果


ログ3:name, email をスペースで字下げして出すコード3.gs

コード3.gs
function myJSON() {
  var obj = {
    'id': 12345,
    'name': 'ooo',
    'email': 'ooo@gmail.com',
    'city': 'tokyo'
  }
  var replacer = ['name', 'email'];
  var space = 2;
  var json = JSON.stringify(obj, replacer, space);
  Logger.log(json);
}


実行結果


LiveChatでチャット終了後のタグ更新をwebhookでキャッチしたい


LiveChatで利用できるWebhookのイベントは6つある

  1. chat starts
  2. chat ends
  3. chat changed
  4. visitor is queued
  5. ticket is created
  6. canned response changed


前提
  • chat ends はチャットが終わったときにデータを送る
  • chat changed はタグが更新されたときにデータを送る

今回欲しいのは

  • chat ends 後の chat changed の情報


何があれば取得できそう?
  • chat changed で送られたデータの中に「チャットが終わっている」という情報があるといい(例えば chat_ended: true みたいな)

調べてみた結果

  1. チャット中と終了後にタグを更新したログを見ると ended_timestamp がある
    • けれど
      • チャット中にタグを更新した時にも値が入る(ここがnullなら使えた)
      • チャット終了時に値が更新される
    • なので使えない
  2. チャットが終了していない場合は、chat の中に events が存在しない
    • 1の情報は使えないので使えるとしたらこれ
2でやってみる



    コード.gs
    function doPost(e) {
      var contents = e.postData.contents
      console.log(contents);
      
      var jobj = JSON.parse(contents);
      var isEnded = judgeEnded(jobj);
      if(isEnded) {
        var chatId = jobj['chat']['id'];
        var tags = jobj['chat']['tags'];
        doSomething(chatId, tags);
      } else {
        console.log('not ended'); 
      }
    }
    
    function judgeEnded(jobj) {
      var events = jobj['chat']['events'];
      if(events === undefined) {
        return false;
      }
      return true;
    }
    
    function doSomething(chatId, tags) {
      console.log(["ended!", chatId, tags]);
    }
    
    
    意訳
    この機能がやること
    送られてきたデータからcontentsを取得して
    ログに出す
    
    JSONからJavaScriptのオブジェクトに変換する
    chatが終わっているかどうかtrue/falseで判定する
    chatが終わっていたら
    idを取得して
    tagsを取得して
    それを使って任意の処理をする
    chatが終わっていなければ
    not endedをログに出す
    
    
    
    この機能がやること
    受け取ったデータの中の events を取得する
    eventsが見つからなければ
    falseを返す
    見つかれば
    trueを返す
    
    
    この機能がやること
    受け取ったchatId, tagsをログに出す
    
    
    


    関連記事

    LiveChatのwebhookを使ってみる
    LiveChatのwebhookを使ってみる(チャット終了後にタグを更新する)
    LiveChatのwebhookを使ってみる(チャット中と終了後にタグを更新したログ)


    参考

    Building webhook integration
    https://developers.livechatinc.com/docs/build-integration/

    node-zendeskでカスタムフィールドの値が一致するチケットを更新する(search.query, tickets.updateMany)


    この記事では
    node-zendeks の  search.query と tickets.updateMany 
    カスタムフィールドの値(一意)を検索して
    一致したチケットを更新するコードを書いて実行するところまで行きます


    node-zendesk を使ったことがない場合はまず Example を試しましょう
    node-zendeskを使ってみる(Example)


    以下3つの記事の合わせ技です



    STEP
    1. index.jsを書いて保存する
    2. index.jsを実行する


    STEP1:index.jsを書いて保存します
    • username, token, remoteUri は各自の環境に応じたものを入れます
    • query の fieldValue: に検索したい値を入れます
    • additional_tags, custom_fields の id, value を設定します

    index.js 
    var zendesk = require('node-zendesk');
    
    var client = zendesk.createClient({
      username: 'Email',
      token: 'API TOKEN',
      remoteUri: 'https://NAME.zendesk.com/api/v2'
    });
    
    /************************************
    チケットを探索する
    *************************************/
    var query = "fieldValue:issue-00001";
    client.search.query(query, function(err, req, result) {
      if (err) return handleError(err);
      console.log(JSON.stringify(result, null, 2, true));
      var ticketId = result[0]['id'];
      console.log(ticketId);
      updateTicket(ticketId);
    });
    
    function handleError(err) {
      console.log(err);
      process.exit(-1);
    }
    
    /************************************
    チケットを更新する
    *************************************/
    var updateTicket = function(ticketId) {
      client.tickets.updateMany(ticketId, ticket, function(err, req, result) {
        if (err) return handleError(err);
        console.log(JSON.stringify(result, null, 2, true));
      });
    }
    
    var ticket = {
      "ticket": {
        "additional_tags": ["test4"],
        "custom_fields": [{
          "id": 360018428654,
          "value": "みかん"
        }]
      }
    };
    
    function handleError(err) {
      console.log(err);
      process.exit(-1);
    }
    
    



    STEP2:実行してみる

    ターミナル
    index.jsが入っているディレクトリ $ node index.js

    zendeskの対象チケットの情報が、このように返ってきました
    MacBook-Air-8:nodezendeskTest NAME$ node index.js
    [
      {
        "url": "https://NAME.zendesk.com/api/v2/tickets/16.json",
        "id": 16,
        "external_id": null,
        "via": {
          "channel": "api",
          "source": {
            "from": {},
            "to": {},
            "rel": null
          }
        },
        "created_at": "DATETIME",
        "updated_at": "DATETIME",
        "type": null,
        "subject": "テストタイトルです!",
        "raw_subject": "テストタイトルです!",
        "description": "本文です",
        "priority": null,
        "status": "open",
        "recipient": null,
        "requester_id": ID,
        "submitter_id": ID,
        "assignee_id": ID,
        "organization_id": ID,
        "group_id": ID,
        "collaborator_ids": [],
        "follower_ids": [],
        "email_cc_ids": [],
        "forum_topic_id": null,
        "problem_id": null,
        "has_incidents": false,
        "is_public": true,
        "due_at": null,
        "tags": [
          "test1",
          "test2",
          "test3",
          "test4",
          "みかん"
        ],
        "custom_fields": [
          {
            "id": 360018014474,
            "value": "めろん"
          },
          {
            "id": 360018442253,
            "value": ""
          },
          {
            "id": 360018495613,
            "value": "issue-00001"
          },
          {
            "id": 360017830594,
            "value": ""
          },
          {
            "id": 360018428654,
            "value": "みかん"
          }
        ],
        "satisfaction_rating": null,
        "sharing_agreement_ids": [],
        "fields": [
          {
            "id": 360018014474,
            "value": "めろん"
          },
          {
            "id": 360018442253,
            "value": ""
          },
          {
            "id": 360018495613,
            "value": "issue-00001"
          },
          {
            "id": 360017830594,
            "value": ""
          },
          {
            "id": 360018428654,
            "value": "みかん"
          }
        ],
        "followup_ids": [],
        "brand_id": ID,
        "allow_channelback": false,
        "allow_attachments": true,
        "result_type": "ticket"
      }
    ]
    16
    {
      "job_status": {
        "id": "ID",
        "url": "https://NAME.zendesk.com/api/v2/job_statuses/ID.json",
        "total": null,
        "progress": null,
        "status": "queued",
        "message": null,
        "results": null
      }
    }


    node-zendeskでカスタムフィールドの値を検索してみる(search.query)


    この記事では
    node-zendeks の  search.query で
    カスタムフィールドの値を検索するコードを書いて実行するところまで行きます


    node-zendesk を使ったことがない場合はまず Example を試しましょう
    node-zendeskを使ってみる(Example)



    STEP
    1. index.jsを書いて保存する
    2. index.jsを実行する


    STEP1:index.jsを書いて保存します
    • username, token, remoteUri は各自の環境に応じたものを入れます
    • query の fieldValue: に検索したい値を入れます

    index.js 
    var zendesk = require('node-zendesk');
    
    var client = zendesk.createClient({
      username: 'Email',
      token: 'API TOKEN',
      remoteUri: 'https://NAME.zendesk.com/api/v2'
    });
    
    var query = "fieldValue:issue-00001";//この例では一意の値
    client.search.query(query, function(err, req, result) {
      if (err) return handleError(err);
      console.log(JSON.stringify(result, null, 2, true));
      console.log(result[0]['id']); //チケットIDを取得する
    });
    
    function handleError(err) {
      console.log(err);
      process.exit(-1);
    }
    
    


    補足

    上のコードの例では
    以下のように issue-00001 という値を持つカスタムフィールドがあり
    その値は他のフィールドには存在しない一意である想定です
    console.log(result[0]['id']) のところで0番目のチケットIDを取得しています

    fieldValue で指定した値が一意でない場合は、検索結果の1番目以降のチケット情報も配列に返ってきます

    特定のカスタムフィールドを指定して、その値のみを検索する機能は現状では存在しないようです

    FYI


    STEP2:実行してみる

    ターミナル
    index.jsが入っているディレクトリ $ node index.js

    zendeskの対象チケットの情報が、このように返ってきました
    MacBook-Air-8:nodezendeskTest NAME$ node index.js
    [
      {
        "url": "https://NAME.zendesk.com/api/v2/tickets/16.json",
        "id": 16,
        "external_id": null,
        "via": {
          "channel": "api",
          "source": {
            "from": {},
            "to": {},
            "rel": null
          }
        },
        "created_at": "DATETIME",
        "updated_at": "DATETIME",
        "type": null,
        "subject": "テストタイトルです!",
        "raw_subject": "テストタイトルです!",
        "description": "本文です",
        "priority": null,
        "status": "open",
        "recipient": null,
        "requester_id": ID,
        "submitter_id": ID,
        "assignee_id": ID,
        "organization_id": ID,
        "group_id": ID,
        "collaborator_ids": [],
        "follower_ids": [],
        "email_cc_ids": [],
        "forum_topic_id": null,
        "problem_id": null,
        "has_incidents": false,
        "is_public": true,
        "due_at": null,
        "tags": [
          "test1",
          "test2",
          "test3",
          "りんご"
        ],
        "custom_fields": [
          {
            "id": 360018014474,
            "value": "めろん"
          },
          {
            "id": 360018442253,
            "value": ""
          },
          {
            "id": 360018495613,
            "value": "issue-00001"
          },
          {
            "id": 360017830594,
            "value": ""
          },
          {
            "id": 360018428654,
            "value": "りんご"
          }
        ],
        "satisfaction_rating": null,
        "sharing_agreement_ids": [],
        "fields": [
          {
            "id": 360018014474,
            "value": "めろん"
          },
          {
            "id": 360018442253,
            "value": ""
          },
          {
            "id": 360018495613,
            "value": "issue-00001"
          },
          {
            "id": 360017830594,
            "value": ""
          },
          {
            "id": 360018428654,
            "value": "りんご"
          }
        ],
        "followup_ids": [],
        "brand_id": ID,
        "allow_channelback": false,
        "allow_attachments": true,
        "result_type": "ticket"
      }
    ]
    16

    一番下の 16 という数字は、検索結果のチケットのIDです


    参考

    node-zendesk / ReadMe.md / search / query 
    https://github.com/blakmatrix/node-zendesk#search

    search-query.js
    https://github.com/blakmatrix/node-zendesk/blob/master/examples/search-query.js

    How to search tickets by using custom field?

    node-zendeskでチケット情報を取得してみる(tickets.show)


    この記事では
    node-zendeks の  tickets.show で
    指定したチケットの情報を表示するコードを書いて実行するところまで行きます

    node-zendesk を使ったことがない場合はまず Example を試しましょう
    node-zendeskを使ってみる(Example)



    STEP
    1. index.jsを書いて保存する
    2. index.jsを実行する


    STEP1:index.jsを書いて保存します
    • username, token, remoteUri は各自の環境に応じたものを入れます
    • ticketId は対象のチケットIDを指定します

    index.js 
    var zendesk = require('node-zendesk');
    
    var client = zendesk.createClient({
      username: 'Email',
      token: 'API TOKEN',
      remoteUri: 'https://NAME.zendesk.com/api/v2'
    });
    
    var ticketId = 16;
    client.tickets.show(ticketId, function(err, req, result) {
      if (err) return handleError(err);
      console.log(JSON.stringify(result, null, 2, true));
    });
    
    function handleError(err) {
      console.log(err);
      process.exit(-1);
    }
    



    STEP2:実行してみる

    ターミナル
    index.jsが入っているディレクトリ $ node index.js

    zendeskの対象チケットの情報が、このように返ってきました
    MacBook-Air-8:nodezendeskTest NAME$ node index.js
    {
      "url": "https://NAME.zendesk.com/api/v2/tickets/16.json",
      "id": 16,
      "external_id": null,
      "via": {
        "channel": "api",
        "source": {
          "from": {},
          "to": {},
          "rel": null
        }
      },
      "created_at": "DATETIME",
      "updated_at": "DATETIME",
      "type": null,
      "subject": "テストタイトルです!",
      "raw_subject": "テストタイトルです!",
      "description": "本文です",
      "priority": null,
      "status": "open",
      "recipient": null,
      "requester_id": ID,
      "submitter_id": ID,
      "assignee_id": ID,
      "organization_id": 3 ID,
      "group_id": ID,
      "collaborator_ids": [],
      "follower_ids": [],
      "email_cc_ids": [],
      "forum_topic_id": null,
      "problem_id": null,
      "has_incidents": false,
      "is_public": true,
      "due_at": null,
      "tags": [
        "test1",
        "test2",
        "test3",
        "りんご"
      ],
      "custom_fields": [
        {
          "id": 360018014474,
          "value": "めろん"
        },
        {
          "id": 360018442253,
          "value": ""
        },
        {
          "id": 360018495613,
          "value": ""
        },
        {
          "id": 360017830594,
          "value": ""
        },
        {
          "id": 360018428654,
          "value": "りんご"
        }
      ],
      "satisfaction_rating": null,
      "sharing_agreement_ids": [],
      "fields": [
        {
          "id": 360018014474,
          "value": "めろん"
        },
        {
          "id": 360018442253,
          "value": ""
        },
        {
          "id": 360018495613,
          "value": ""
        },
        {
          "id": 360017830594,
          "value": ""
        },
        {
          "id": 360018428654,
          "value": "りんご"
        }
      ],
      "followup_ids": [],
      "brand_id": ID,
      "allow_channelback": false,
      "allow_attachments": true
    }


    参考

    node-zendesk / ReadMe.md / tickets / show
    https://github.com/blakmatrix/node-zendesk#tickets

    Latest post

    Extracting data from Google Sheets with regular expressions

    Introduction Regular expressions are a powerful tool that can be used to extract data from text.  In Google Sheets, regular expressions ca...