概要
Google Apps Script (以下 GAS) は UrlFetchApp.fetch で様々なSaaSのWeb APIへアクセス出来て非常に便利ですが、一方で、サーバーサイドにおけるバッチ処理で一般的な .env
ファイルの様なものをスクリプトのファイルとは別に用意しておく、といったことができません。
この為、各種Web APIを呼ぶための Client ID
と Client Secret
や APIトークン
など(以下 トークン類)は処理中に直接記載するか、本体とは別の .gs
ファイルに書くなどする必要があります。
その場合でも、 Google Apps Script GitHubアシスタント などを使って GAS のソースコードを管理しようとすると、トークン類が記載されたソースコードがそのまま GitHub
上で管理されてしまったりして、Web API を利用するSaaSに対して情報セキュリティ上は好ましくありません。
そこで、 Google Spreadsheet
を使ってGASのソースコードとトークン類を分けて管理し、トークン類へはSpreadSheetAppクラスを経由してアクセスする様にします。
トークン類を置くスプレッドシートを別途用意する
- トークン類を保存する
Google Spreadsheet
を用意する - 用意した
Google Spreadsheet
には、記載されたトークン類を共有しても良いアカウントだけが見られるように共有範囲を正しく設定しておく- 企業内で使う場合は
Google Groups
等で権限設定すると属人化せず管理が楽かもしれません。
- 企業内で使う場合は
- GAS側でトークン類が必要な際はスプレッドシートから読むようにする
GASからスプレッドシート上のトークンを読み込む
const spread = SpreadsheetApp.openById('hoge'); // hoge = 用意したスプレッドシートのドキュメントID
const sheet = spread.getSheetByName('fuga'); // fuga = スプレッドシートのタブ名
const token = sheet.getRange(piyo_row, piyo_column).getValue(); // スプレッドシート内で対象となるトークンが記載されている位置を指定する : piyo_row = 行、piyo_column = 列数
// 取得したtokenを使ってWeb APIを呼ぶ (Bearer token の場合の例)
const options = {
"method" : "GET",
"headers" : { "Authorization" : "Bearer " + token
"Content-type" : "application/json; charset=utf-8"
},
"muteHttpExceptions" : true
};
const url = "https://api.hoge.fuga/foo/bar";
const response = UrlFetchApp.fetch(url,options);
下記の様に関数化しておくと汎用的に利用できるでしょう
function GetTokenFromSheet(documentID,tabName,X,Y) {
const spread = SpreadsheetApp.openById(documentID);
if (spread == null) return null;
const sheet = spread.getSheetByName(tabName);
if (sheet == null) return null;
return sheet.getRange(Y, X).getValue();
}
myWebToken = GetTokenFromSheet('hoge_sheet_ID', 'fuga_tab_name', 1,1);
これでも 結局はソース内にドキュメントIDやタブ名やシート位置が直接書かれてしまう のが欠点ですが、少なくとも GASのソースコードとトークン類そのものとは分離される ので、SaaSの管理は別部門が行っている場合や、複数のGASやプロジェクトで同じトークンを何度も使う場合などでは、GASと切り離してトークン類を管理できて便利です。
注意点
- GAS側がSpreadSheet API
- トークン類を置いたスプレッドシートはGASの実行者が読める必要がある(書き込み権限は不要)
- ドキュメントID、スプレッドシート内でのタブ名やトークン類が記載されているセルの位置(行数、カラム数)などは別途伝える必要がある
- ドキュメントID、タブ名、記載セル位置なども更に別のスプレッドシートで管理しておく、という方法も一つの手かもしれません。ただし管理しなければいけないスプレッドシートが増えますが…。
そのほか
APIトークン
や Client Secret
といったものは漏れてしまうとSaaSへ不正にアクセスされてしまうことがあり、扱いは気を付ける必要があります。
一方で、「APIとかよくわからない」「なんか危なそう」というイメージでWeb APIを使うのを避けるのも、DX(Digital Transformation)
や BPR(Business Process Re-engineering)
といった観点からは非常に非効率です。
Web APIが利用できるのであればトークン類を安全に管理しつつ存分に活用して、SaaSを有効活用したいものですね。