現象
GASで関数を単体実行した際にこのようなエラーが表示された。
ReferenceError: xxx is not defined
タイポかなと思って見返してみたけど、スクリプトエディタで書き直してみるとxxxが補完されるからコードは問題ない。
構成
- src
- Sheet.gs スプレットシートとやり取りするモジュール
- Logs.gs スプレットシートにログを書き込むモジュール。Sheetモジュールを参照している
- test
- TestLogger.gs Logs.gsのユニットテスト目的のソースファイル
Sheet.js
const SpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
const Sheet = {
Config: SpreadSheet.getSheetByName('config'),
Logs: SpreadSheet.getSheetByName('logs')
};
Logs.js
class Logs {
WriteLog(message) {
// 現在日時はUTC時間から日本時間へ変更する
const dateformated = (dateitem) => {
return (dateitem < 10 ? '0' : '') + dateitem;
}
const now = new Date(Date.now() + (new Date().getTimezoneOffset() + 9 * 60) * 60 * 1000);
const nowstr = now.getFullYear() + '/' +
dateformated(now.getMonth() + 1) + '/' +
dateformated(now.getDate()) + ' ' +
dateformated(now.getHours()) + ':' +
dateformated(now.getMinutes()) + ':' +
dateformated(now.getSeconds());
Sheet.Logs.appendRow([nowstr, message]);
}
}
const Logger = new Logs();
TestLogger.js
function TestLogger() {
const messages = ["hogehoge", "fugauga", "amazon"];
messages.forEach(m => Logger.WriteLog(m));
}
原因
GASプロジェクト内のソースファイルの順序が正しくなかった。
関数を実行する際、どうやらファイル内の順序でスクリプトファイルがロードされているようで、
ロードされたスクリプトファイルが他のスクリプトファイルを参照する場合は先にロードしておく必要がある。
正しくは下記の順となるが、順序が間違っていると参照できなくてReferenceErrorとなる。
- Sheet.gs
- Logs.gs
- TestLogger.gs
スクリプトエディタから直接編集する場合は順序を入れ替えることはないが、
claspからpushするとソースファイルの昇順で入れ替わるのでデプロイ後に並べ替えが必要。