GAS(Goolgle App Script)でzendeskから情報を取得して、スプレッドシートに記録するコードを書きました。
なんでやったの?
ある業務で redash を使って進捗管理をしていたのですが、zendesk上にのみ顧客対応ステータスの情報が登録されていました。
redashから検索keyをコピーしてzendeskで検索して…っていうのを毎日やっててイヤになったので、redashでzendeskの情報を出せるようにしてやりました。
完成したやつ
先にコードを載せておきます。
zendeskからチケットIDとカスタムフィールド3つを取得して、スプレに出力しています。
function zendeskGet() {
//検索条件をURLエンコードしてHTTPリクエストするための情報に変換
var query = '検索内容をここに入れる'; //検索内容
var res1 = encodeURI(query); //検索クエリ
var url = 'https://サブドメイン名.zendesk.com/api/v2/search.json?query=' + res1;
//認証用情報
const TOKEN = 'トークンを入れる';
const EMAIL = 'メールアドレス';
var data = {
'email': EMAIL,
'token': TOKEN
};
//dataをzendesk認証用に置き換え
var options = {
'method': 'get',
'headers': {
'Authorization': "Basic " + Utilities.base64Encode(Utilities.newBlob(data.email + '/token:' + data.token).getBytes()),
'contentType': 'application/json',
'Accept': 'application/json'
}
};
//urlと認証情報をマージ
var response = UrlFetchApp.fetch(url, options);
//json形式で取得
var json = JSON.parse(response.getContentText("UTF-8"));
//jsonを配列に入れる
var zendeskDataRow = [];
zendeskDataRow.push(json);
var zendeskData = zendeskDataRow[0].results
//各データを格納する二次元配列の箱を用意
var tickets = [];
var eddReqIds = [];
var eddStatuses = [];
var kycKinds = [];
//取得したいzendeskのカスタムフィールドのID
var eddReq = 'フィールドIDを入れる';
var eddStatus = 'フィールドIDを入れる';
var kycKind = 'フィールドIDを入れる';
//チケットIDと指定のカスタムフィールドの値を取得
for(var j=0;j<zendeskData.length;j++){
tickets.push([zendeskData[j].id]);
for(var i=0;i<zendeskData[j].custom_fields.length;i++){
var customFieldId = zendeskData[j].custom_fields[i].id
if(customFieldId == eddStatus){
eddStatuses.push([zendeskData[j].custom_fields[i].value]);
}
if(customFieldId == kycKind){
kycKinds.push([zendeskData[j].custom_fields[i].value]);
}
if(customFieldId == eddReq){
eddReqIds.push([zendeskData[j].custom_fields[i].value]);
}
}
};
//スプレに貼り付け
var sheet = SpreadsheetApp.openById("シートIDを入れる").getSheetByName("シート名を入れる"); //書き込むスプレを指定
var lastLow = sheet.getLastRow();
var clearRange = sheet.getRange(2, 1, lastLow, 4)
var datalastRow = eddReqIds.length;
clearRange.clear();
sheet.getRange(2, 1, lastRow, 1).setValues(eddReqIds);
sheet.getRange(2, 2, lastRow, 1).setValues(eddStatuses);
sheet.getRange(2, 3, lastRow, 1).setValues(kycKinds);
sheet.getRange(2, 4, lastRow, 1).setValues(tickets);
}
どうやったの?
redash でスプレッドシートの情報を取得できる環境が整っていたので、zendesk→スプレッドシート→redash を目指しました。遠回りになりますが、GASでzendeskからスプレに出力できるのは分かっていたので、今の知識の範囲でやれる方法を選択しました。
ステップはこんな感じです。
- zendeskで検索条件を決める
- URLエンコードする
- zendeskにアクセスしてjsonを取得する
- jsonを整形する
- スプレッドシートに貼り付ける
zendeskで検索条件を決める
まずzendesk Supportで検索条件を設定します。 zendesk上で検索がうまくできているか確認できるのはすごくいいですよね。検索条件はいろいろ設定できるのでzendeskのドキュメントを参考にしてください。
こちらは例です。
この検索条件を +
で繋ぎます。上記の例だと、aaa+updated>"2022-11-01"+updated<"2022-11-19"+status:solved
ですね。
これを基にzendeskから情報を取得することになります。(次のステップに出てくる ver query = 部分に入れるもの)
ちなみに、ほしい情報が取得できているかはブラウザで以下のように入力すればjsonが確認できます。https://SUBDOMAIN.zendesk.com/api/v2/search.json?query=ここに検索条件を入れる
つまり上記の例だとこれですね。
https://SUBDOMAIN.zendesk.com/api/v2/search.json?query=aaa+updated>"2022-11-01"+updated<"2022-11-19"+status:solved
なお、 SUBDOMAIN
部分は契約しているサブドメイン名を入れてください。サブドメイン名はzendesk supportを開いたときのURLでわかります。 https://ここがサブドメイン.zendesk.com
URLエンコードする
検索条件URLに使える文字の組み合わせに変換します。
encodeURI関数(encodeURI(URI)
)を使います。
//検索条件をURLエンコードしてHTTPリクエストするための情報に変換
var query = '検索条件をここに入れる'; //検索内容
var res1 = encodeURI(query); //検索クエリ
var url = 'https://サブドメイン名.zendesk.com/api/v2/search.json?query=' + res1;
ちなみにURLとURIの違いが気になる方はこちらをどうぞ。
zendeskにアクセスしてjsonを取得する
認証情報を設定してアクセスします。
//認証用情報
const TOKEN = 'トークンを入れる';
const EMAIL = 'メールアドレス';
var data = {
'email': EMAIL,
'token': TOKEN
};
//dataをzendesk認証用に置き換え
var options = {
'method': 'get',
'headers': {
'Authorization': "Basic " + Utilities.base64Encode(Utilities.newBlob(data.email + '/token:' + data.token).getBytes()),
'contentType': 'application/json',
'Accept': 'application/json'
}
};
//urlと認証情報をマージ
var response = UrlFetchApp.fetch(url, options);
//json形式で取得
var json = JSON.parse(response.getContentText("UTF-8"));
ちなみに、zendeskのAPIトークンは、[zendesk管理センター]>[Zendesk API]>[APIトークンを追加]で取得できます。
jsonを整形する
jsonを配列に入れちゃいます。
results
のなかにチケットIDやカスタムフィールドの情報が入ってます。変数 zendeskData
としておきます。
//jsonを配列に入れる
var zendeskDataRow = [];
zendeskDataRow.push(json);
var zendeskData = zendeskDataRow[0].results
チケットIDは id
、カスタムフィールドは custom_fields
のなかの value
に値が入ってます。
for文で対象チケットのチケットIDとカスタムフィールドの情報を配列にガーッと入れていきます。
スプレに出力するときは、for文で都度値を入力するよりも、配列に入れて setValues()
したほうが負荷が少ないのでおすすめです。
//各データを格納する二次元配列の箱を用意
var tickets = [];
var eddReqIds = [];
var eddStatuses = [];
var kycKinds = [];
//取得したいzendeskのカスタムフィールドのID
var eddReq = 'フィールドIDを入れる';
var eddStatus = 'フィールドIDを入れる';
var kycKind = 'フィールドIDを入れる';
//チケットIDと指定のカスタムフィールドの値を取得
for(var j=0;j<zendeskData.length;j++){
tickets.push([zendeskData[j].id]);
for(var i=0;i<zendeskData[j].custom_fields.length;i++){
var customFieldId = zendeskData[j].custom_fields[i].id
if(customFieldId == eddStatus){
eddStatuses.push([zendeskData[j].custom_fields[i].value]);
}
if(customFieldId == kycKind){
kycKinds.push([zendeskData[j].custom_fields[i].value]);
}
if(customFieldId == eddReq){
eddReqIds.push([zendeskData[j].custom_fields[i].value]);
}
}
};
スプレッドシートに貼り付ける
スプレにアクセスして指定のセルに貼り付けます。
スプレにアクセスするときは SpreadsheetApp.openById("シートIDを入れる").getSheetByName("シート名を入れる")
これが楽だしわかりやすいからよく使ってるんですけど皆さんはどうですか?
clearRange.clear();
これでシートを一度クリアして更新したほうが良いです。当初これをしてなくて、前回の差分が残っている状態になってしまっていました。(情報を上からペーストするだけになるので、前回より情報が少ないと差分が上書きされずに残ってしまう)
//スプレに貼り付け
var sheet = SpreadsheetApp.openById("シートIDを入れる").getSheetByName("シート名を入れる"); //書き込むスプレを指定
var lastLow = sheet.getLastRow();
var clearRange = sheet.getRange(2, 1, lastLow, 4)
var datalastRow = eddReqIds.length;
clearRange.clear();
sheet.getRange(2, 1, lastRow, 1).setValues(eddReqIds);
sheet.getRange(2, 2, lastRow, 1).setValues(eddStatuses);
sheet.getRange(2, 3, lastRow, 1).setValues(kycKinds);
sheet.getRange(2, 4, lastRow, 1).setValues(tickets);
あとはredashでスプレの情報を取得してクエリを書けば完成です。 トリガーで定期実行しておけば毎朝最新の情報になっています!
結果
めちゃくちゃ便利でした。
毎日進捗管理に30分くらい使ってたんですけど、3分で終わるようになりました。
検索条件から取りたい情報を決められるのはすごい便利と思います。コード書けなくても検索条件をスプレに入力してもらえれば、GASで読み取って出力する、みたいなことも実現できるし。 あれ調べたいなーとか、あれ調べといてーというときに、zendeskでの検索条件を決めればいいだけだから、GASが分からない人でも扱えて一次情報の分析も捗りますねこれは!
余談
使わなかったけど今回で学んだこと。
for of
今回は条件分岐のために回数情報が必要だったので使わなかったけどこれは便利。知らなかった。
変数のデータ型を確認する方法
おわり。