Skip to content

Instantly share code, notes, and snippets.

@carthegian
Created April 9, 2021 01:31
Show Gist options
  • Save carthegian/b54eece26ff719d2d8a463cdab4057d2 to your computer and use it in GitHub Desktop.
Save carthegian/b54eece26ff719d2d8a463cdab4057d2 to your computer and use it in GitHub Desktop.
Google Apps Script example to call API via CURL
/**
* 関数を実行するメニューを追加
*/
function onOpen() {
var menuExecution =[
{name: "json整形", functionName: "indentJson"},
{name: "当シートAPIをcurlで実行", functionName: "automateCurrentAPICall"},
{name: "全てAPIをcurlで実行", functionName: "automateAllAPICalls"},
];
SpreadsheetApp.getActiveSpreadsheet().addMenu("オプションメニュー",menuExecution); //オプションメニューを追加
}
/**
* ポストマンからコピペするとインデントとか"とか消えるから整形する
* Updated 20210408: paramsObjが存在したら、GASからの呼びかけ
*/
function indentJson(paramsObj = null) {
// アクティブなシート取得
var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var objSheet = objSpreadsheet.getActiveSheet();
// アクティブな範囲取得
// GASからの呼びかけの場合: パラメーターからrange
var objRange = paramsObj ? paramsObj.range : objSheet.getActiveRange();
// アクティブなセル取得
// GASからの呼びかけの場合、パラメーターからcell
var objCell = paramsObj ? paramsObj.cell : objSheet.getActiveCell();
// 選択されている範囲の値を取得
var values = objRange.getValues();
// もし2行目にスペースが見つかったらもう整形済みのはずなので後続の処理はやらない
if(values[1][0].indexOf(' ') != -1) {
Browser.msgBox("そのjson,もう整形終わってるよ");
return;
}
// スペース入れる数
var indentnum = 0;
for(var i = 0; i < values.length; i++) {
var str = values[i][0];
var space = "";
// }か},か]か],を見つけたらスペース入れる数を一つ減らす
if(str.indexOf('}') != -1 || str.indexOf('},') != -1 ||
str.indexOf(']') != -1 || str.indexOf('],') != -1 ) {
indentnum--;
}
// :を見つけたら先頭と見つけた位置に"を入れる
var index = str.indexOf(':');
// GASからの呼びかけの場合、このIFをスキップする
if(index != -1 && paramsObj == null) {
str = strIns(str, index, "\"");
str = strIns(str, 0, "\"");
}
// indentnum*4つのスペースを入れる
for(var j = indentnum; j > 0; j--) {
space = space + " ";
}
// 整形した文字列をスプレッドシートに反映する
if (paramsObj) {
paramsObj.sheet.getRange(objCell.getRow() + i, objCell.getColumn()).setValue(space + str);
} else {
SpreadsheetApp.getActiveSheet().getRange(objCell.getRow() + i, objCell.getColumn()).setValue(space + str);
}
// {か{,か[か[,を見つけたらスペース入れる数を一つ増やす
if(str.indexOf('{') != -1 || str.indexOf('[') != -1 ) {
indentnum++;
}
}
}
/**
* 「テストケースの実行」の際に利用できる自動化オプション
* 全ての「エビデンスシート」で、シート毎に「URLリクエスト」を叩く
* Date: 20210408
*/
function automateAllAPICalls() {
var ui = SpreadsheetApp.getUi();
var response = ui.alert('全てAPIリクエストを実行する? 注意:すでに入力された項目を上書きされる', ui.ButtonSet.YES_NO);
// ユーザーのレスポンスを処理する
if (response == ui.Button.YES) {
Logger.log('Proceed with automateAPICalls');
} else {
Logger.log('Cancelling automateAPICalls');
return;
}
// シート毎をループする
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i = 0; i < sheets.length ; i++ ) {
// エビデンスシートのみ処理を行う
if (sheets[i].getSheetName().includes("エビデンス")) {;
callAPIWrapper(sheets[i]);
}
}
}
/**
* 「テストケースの実行」の際に利用できる自動化オプション
* 当シート「URLリクエスト」のみを叩く
* Date: 20210409
*/
function automateCurrentAPICall() {
var currentSheet = SpreadsheetApp.getActiveSheet();
callAPIWrapper(currentSheet);
}
/**
* 「テストケースの実行」の際に利用できる自動化オプション
* リクエストとレスポンスWrapperメソッド
* Date: 20210409
*/
function callAPIWrapper(sheet) {
// "■リクエスト"という言葉があるセールのインデックスを探す
var textFound = sheet.createTextFinder("■リクエスト").findNext();
// "■リクエスト"がない場合
if (textFound == null) {
Logger.log(sheet.getSheetName() + ": No request URL found");
return;
}
// 見つかったら、一個下の行のデータを取得してAPIを叩く
var rowIndex = textFound.getRow();
var requestUrl = sheet.getRange("A" + (rowIndex + 1)).getValue();
// callAPIviaCurlメソッドを呼んでAPIデータを取得する
var jsonData = callAPIviaCurl(requestUrl);
// "■レスポンス"という言葉があるセールのインデックスを探す
var rowIndex = sheet.createTextFinder("■レスポンス").findNext().getRow();
// jsonData = nullの場合
if (jsonData == null) {
Logger.log(sheet.getSheetName() + ": Empty URL, not calling API");
sheet.getRange("A" + (rowIndex + 1)).setValue("Empty URL, not calling API");
return;
}
// 見つかったら、一個下の行に取得したデータを書く
var outputRange = sheet.getRange(rowIndex + 1,1,jsonData.length,1);
outputRange.setValues(jsonData);
// indentJsonメソッドを呼んでjson整形を直す
var paramsObj = {
range: outputRange,
cell: outputRange.getCell(1, 1),
sheet: sheet
};
indentJson(paramsObj);
Logger.log(sheet.getSheetName() + ": API call success");
}
/**
* 「テストケースの実行」の際に利用できる自動化オプション
* 指定されたURLでAPIを叩く
* Date: 20210408
*/
function callAPIviaCurl(requestUrl) {
// URL = 空の場合、スキップする
if (requestUrl == "") {
return null;
}
// options設定
var options = {
"contentType": "application/json",
"headers":{
"x-platform": "PLATFORM",
"x-api-key": "API_KEY"
}
};
// cURLでAPIを叩く
var response = UrlFetchApp.fetch(requestUrl, options);
// データパース
var parseData = JSON.parse(response);
// jsonを整形
var jsonData = JSON.stringify(parseData, null, "\n");
// \nで分割し、空白行を削除
var array = (jsonData.split("\n")).filter(Boolean);
// setValuesは2次元配列を期待してるのでそこに合わせる
var array2D = [];
for(var i = 0; i < array.length; i++) {
array2D.push([array[i]]);
}
return array2D;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment