Google Apps Scriptsでログが表示されなくなった際の代用方法(GCP不使用)

スポンサーリンク

GASのプロジェクトを作成した際に、Webアプリケーションとしてデプロイすると、console.logLogger.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すればできると思いますが、試してはいません。

大量のログが必要な場合は何れにしても時間がかかるので、あまりお勧めできる方法ではないのですが、数十行程度であれば、十分かと思います。

何かの役に立てればと思います。

コメント

タイトルとURLをコピーしました