LANG SELRCT

コードを書く場所

2019年11月13日水曜日

GASからLambda経由でzendesk APIを実行してシートにチケット情報を書き出したい


GASからLambdaにzendesk_idを渡してzendesk APIのGETで情報取得してシートに書き出したい
で書いたコードの応用です。

zendeskのAPIで一度に取得できるチケット情報は100件ずつのようです。

そのため、101件以上ある場合は100で割った値の小数点以下を繰り上げて、
その回数分繰り返すようにしています。



コード.gs
var host = 'SITENAME.zendesk.com';
var endPoint = 'https://API_ID.execute-api.us-east-1.amazonaws.com/default/get_zendesk_ticket';
var ss_url = 'https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit#gid=0';

//これを実行する
function getZendeskInfo() {
  var response = run(1);
  var objs = JSON.parse(response)["results"];
  var count = JSON.parse(response)["count"];

  objsToSheet(objs);
  runLoop(count);
}

//101件以上ある場合はループで全部とりに行く
function runLoop(count) {
  if(count > 101) {
    var looptime = Math.ceil(count / 100);
    for(var i = 1; i < looptime; i++) {
      var response = run(i + 1);
      var objs = JSON.parse(response)["results"];
      objsToSheet(objs);
    }
  }
}

//受け取ったpageNumのデータを取得して返す
function run(pageNum) {
  var path = '/api/v2/search.json?page=' + pageNum + '&query=created%3E2019-01-01%20type:ticket';
  var payload = {
  'data':{
    'host': host,
    'path': path,
    'zendesk_api_token_base64': getProp('zendesk_api_token_base64')
   }
  }
  var options = {
    'method': 'post',
    'headers': get_headers(),
    'contentType': 'application/json',
    'payload': JSON.stringify(payload)
  }
  var response = UrlFetchApp.fetch(endPoint, options);
  Logger.log(JSON.parse(response)["results"].length)
  return response;
}
  
//API GatewayのAPI KEY
function get_headers() {
  var headers = {
    "x-api-key": getProp('x_api_key')
  }
  return headers;
}

//スクリプトのプロパティから値を取得する
function getProp(key) {
  return PropertiesService.getScriptProperties().getProperty(key);
}

//書き込むシート
function targetSheet() {
  var ss = SpreadsheetApp.openByUrl(ss_url);
  var sheet = ss.getSheets()[0];
  return sheet;
}

//シートに書き込むデータを渡す
function objsToSheet(objs) {
  var sheet = targetSheet();
  var obj = objs[0];
  var keys = Object.keys(obj);// ヘッダーの値
  setSheetHeader(sheet, [keys]);// 一行目に見出しを入れる
  
  var arrays = [];
  for(var i = 0; i < objs.length; i++) {
    var obj = objs[i];
    var values = [];
    for(var j = 0; j < keys.length; j++) {
      var value = obj[keys[j]];
      values.push(value);
    }
    arrays.push(values);
  }
  setDataToSheet(sheet, arrays)
}

//シートにデータを書き込む
function setDataToSheet(sheet, arrays){
  var last_row = sheet.getLastRow();
  var start_row = last_row + 1;
  var start_col = 1;
  var num_rows = arrays.length;
  var num_cols = arrays[0].length;
  var range = sheet.getRange(start_row, start_col, num_rows, num_cols);
  range.setValues(arrays); 
}

//シートの一行目に見出しを書き込む
function setSheetHeader(sheet, arrays) {
  var start_row = 1;
  var start_col = 1;
  var num_rows = 1;
  var num_cols = arrays[0].length;
  var range = sheet.getRange(start_row, start_col, num_rows, num_cols);
  range.setValues(arrays); 
}

//base64tokenを作成する ここで実行したログの値をスクリプトのプロパティに入れておく
function get_base64() {
  var zendesk_api_token = "ZENDESK_API_TOKEN";
  var base64Token = Utilities.base64Encode("EMAIL" + '/token:' + zendesk_api_token);
  Logger.log(base64Token);
}




Lambda側のindex.jsは
GASからLambdaにzendesk_idを渡してzendesk APIのGETで情報取得してシートに書き出したい
に書かれているものと同じです。