はじめに
Google Apps Scriptを用いたサービスを作る場合、メンバーリスト等の設定ファイルはGoogle SpreadSheet上に記載し、そこから都度読み込むという作りになることが多いと思います。
とはいえSpreadSheetの読み込みはそこそこ時間を使うので、更新頻度が低いものは別の形で保存し、そこから早く読み出す形を考えます。
スクリプトプロパティの場合
Propertiesリファレンス
各種APIを利用する場合、トークンをスクリプトプロパティに保存するということが多いです。
スクリプトプロパティは永続的に保存される代わりに、読み込み回数と容量に制限があります。
Quotas for Google Services
上記を確認すると、読み出し制限は無料で50,000/日、Workspaceアカウントの場合は500,000/日となっています。
Workspaceアカウントの場合、社内向けのシステムなら気にするほどではないかと思いますが、容量上限においては1値あたり9KBとなっているため、データ量の多いものだと使い勝手に難が出ることがありそうです。
スクリプトキャッシュの場合
Cache Serviceリファレンス
キャッシュを利用する場合、容量上限は100KBで読み込み回数制限はありません。ただキャッシュなので、最大6時間という保持制限があります。
とはいえ1回読み込めば6時間は速く読み込み可能なので、うまく使えばこちらが便利ということもありそうです。
場合によっては一定時間ごとのトリガーを仕込んでキャッシュを上書きしていくなどもいいかもしれません(試したことないですけど)。
今回はこちらのキャッシュを利用する方法をとることにしました。
コード
キャッシュを利用する前に、SpreadSheetのオブジェクトも1回の処理内で使いまわしたいと思います。
重複で読み込んでもいいように、下記のようにスプレッドシートとワークシートを保存し、あればそちらを読み込むようにします。
//======================================================================================================
// 毎回スプレッドシートを開かなくていいように使いまわす
//======================================================================================================
var _spreadSheetSettings = {};
function getSheet(ssId,wsName){
if(ssId in _spreadSheetSettings){
if(!(wsName in _spreadSheetSettings[ssId]["ws"])){
_spreadSheetSettings[ssId]["ws"][wsName] = _spreadSheetSettings[ssId]["ss"].getSheetByName(wsName);
}
}else{
_spreadSheetSettings[ssId] = {"ss":SpreadsheetApp.openById(ssId),"ws":{}}
_spreadSheetSettings[ssId]["ws"][wsName] = _spreadSheetSettings[ssId]["ss"].getSheetByName(wsName);
}
return _spreadSheetSettings[ssId]["ws"][wsName];
}
その上で、
- キャッシュがあればキャッシュから読み込み
- なければスプレッドシートから読み込み、キャッシュに保存
という形にしようと思います。以下です。
MEMBER_SHHET_IDとMEMBER_SHEET_NAMEにはそれぞれSpreadSheetのIDとシート名が入っています。
Cacheには文字列形式での保存になるので、JSON形式にして保存、読み出しを行うのが簡単です。
キャッシュはdevとデプロイ環境で共通なので、デプロイ環境でのキャッシュを壊さないように別名で管理するのがおすすめです。
今回は「指定文字列+バージョン番号(CACHE_VER)」で保存・呼び出しするようにしています。
デプロイ後、このCACHE_VERを別の番号にするとデータを壊さなくて済みます。
var CACHE_VER = "20220314";
//======================================================================================================
// メンバーリストを取得
// データの更新頻度が低いので、Cacheを利用する
//======================================================================================================
function getMemberList(){
var cache = CacheService.getScriptCache();
var val = cache.get('member_' + CACHE_VER);
if(val){
var values = JSON.parse(val);
return values;
}else{
var ws = getSheet(MEMBER_SHEET_ID,MEMBER_SHEET_NAME);
var values = ws.getRange(1,1,ws.getLastRow(),ws.getLastColumn()).getValues();
//キャッシュの保持は最大の6時間
cache.put("member_" + CACHE_VER,JSON.stringify(values),21600);
return values;
}
}
スプレッドシートの読み込みは計測した結果データが少なくても0.5~1.0秒ほどかかるので、これで読み込み速度の改善が図れると思います。