GASのプロジェクトを作成した際に、Webアプリケーションとしてデプロイすると、console.log
やLogger.log
が実行ログとして表示されないことがありました。
色々と試したのですが、GCPとの連携でも今ひとつうまくいかず、そもそもGCPまで動員してやることなのか、とも思い直して、なんとかならないか、考えてみました。
オリジナル関数を作ってスプレッドシートにログを吐き出す
オリジナルの関数を作って、ログをスプレッドシートに吐き出すことをまず考えました。
当然、これは成功するわけですが、ログ1行ごとにスプレッドシートにアクセスしていたら、ものすごいオーバーヘッドになります。
これを避けるために、ログを配列などに格納して、処理の最後で一括して出力する、ということも考えました。
これならまあまあいけるかな、思いました。
Logger.logに貯めてスプレッドシートに吐き出す
Logger
には、getLog()
という関数があって、これを呼ぶことで、Logger.log()
で記録した内容を全て取得することができます。
これを利用して、doPost()
やdoGet()
の最後で、一気にスプレッドシートにはきだす、ということを考えました。
これならソースコードは全てLogger.log()
で統一できるので、オリジナルのコードは最後にログを吐き出す部分だけで済みます。
作成した関数を他で利用する際にもそのままのコードで持っていけるので、オリジナルの関数で書くよりは可用性は高くなります。
doGet()
やdoPost()
の処理を、try/catch
で括って、finally
句で以下の処理を入れればOK。
let sheet = SpreadsheetApp.openById('スプレッドシートID').getSheetByName('ログを記録するシート名');
if (sheet !== null) {
sheet.insertRowBefore(1);
let dt = new Date();
sheet.getRange('A1').setValue(Utilities.formatDate(dt, "JST", 'yyyy-MM-dd HH:m:ss'));
sheet.getRange('B1').setValue(Logger.getLog());
}
全てのログを1つのセルに表示するのではなく、1行ごとに表示したい場合は、getLog()
の戻り値を改行コードでsplit
すればできると思いますが、試してはいません。
大量のログが必要な場合は何れにしても時間がかかるので、あまりお勧めできる方法ではないのですが、数十行程度であれば、十分かと思います。
何かの役に立てればと思います。
コメント