Created
April 9, 2021 01:31
-
-
Save carthegian/b54eece26ff719d2d8a463cdab4057d2 to your computer and use it in GitHub Desktop.
Google Apps Script example to call API via CURL
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 関数を実行するメニューを追加 | |
*/ | |
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