GASのgetAsがある日突然エラーを吐くようになり、現在も未解決


要約

  • 半年ほど安定稼働していたGAS(Slackへのグラフ自動投稿)が突然エラーを吐き、実行されなくなった
  • ビルドしたグラフを指定のファイル形式に変換するgetAsが潜在的なバグをはらんでいる模様
  • 海外でも同様の事例がたびたび発生しており、ユーザーは途方に暮れている状態

ある日気づいた

弊社では毎日、グラフ化したKPIを、GASを利用してSlackに通知している。
そのグラフは特定のチャンネル・特定の時間に自動投稿されるのだが……

投稿されていない、だと……?

確認してみると一週間弱ほど投稿されていなかった。
慌ててGASの方を確認してみる……やはりエラーを吐いていた。

これらの列は範囲外にあります。 at myFunction(コード:100)

当然見慣れないエラーだった。該当の行を見に行く。

  // sample code
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getRange("A1:B13");
  const chart = sheet.newChart().addRange(range).asComboChart().build();
  const chartImage = chart.getAs('image/png')

※ 画像のデータはサンプルです。

いろいろと試行錯誤した結果、setPostion()という関数を追加することによってうまくいくことがわかった。この関数は、生成したグラフをどこかのシートに挿入したいときに、そのセル位置を定める関数だ。元々のコードでは、Slackにグラフ画像を送るだけだったので利用していなかった。

  // 修正後
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getRange("A1:B13");
  const chart = sheet.newChart().addRange(range).asComboChart().setPostion(1,3,0,0)build();
  const chartImage = chart.getAs('image/png')

この関数の追加により、getAs()でエラーは出なくなった。
しかしsetPostion()がなくても今まで安定して実行されていたし、なぜ急にエラーになったのだろう。

それだけじゃない。投稿後のグラフ画像が見栄えが悪いのだ
上記のコードはサンプルのために簡素化して記載したが、実際のコードはグラフの見栄えをよくするために、いろいろと設定を加えていたのだ。ところがsetPostion()を追加するとそれらの設定がまったく効かなくなってしまうようだった。

setPostion()の追加でエラーは出なくなったが……

Slackにグラフ画像を投稿できても、見た目が悪すぎるために使いものにならない。
いろいろ調べたところ、海外でも同様の事例が発生しているらしく、googleのissuetrackerで同様の議論がされていた。
結論としてはおそらくGASの潜在バグなのだろうが、googleからの公式的な回答はなく、みんな途方に暮れていた。
議論の最後にはこんな一文があった……

最後は神頼みか……