見出し画像

アドベントカレンダー2023 #16 予期せぬ例外の解決

はじめに

今日の記事では、Google Apps Script (GAS) で遭遇した予期せぬ例外の解決過程を共有します。.getBlob() メソッドで例外が発生する問題についてです。この問題は、環境や設定ではなく、実際にはグラフの形状に関連し発生することがあることがわかりました。

Google Apps Scriptによるチャート画像の保存処理

この関数は、Googleスプレッドシート内の特定のシートから最初のグラフを画像として保存し、その画像のURLを返します。以下はそのスクリプトのコードです。

function saveChartAsImage(SPREADSHEET_ID, SHEET_NAME, FOLDER_ID) {
  // 指定されたフォルダIDを使用してDriveからフォルダを取得
  var folder = DriveApp.getFolderById(FOLDER_ID);
  if (!folder) {
    Logger.log("指定されたフォルダが見つかりませんでした。");
    return null;
  }

  // 指定されたスプレッドシートIDを使用してスプレッドシートを開く
  var ss = SpreadsheetApp.openById(SPREADSHEET_ID);
  // 指定された名前のシートを取得
  var sheet = ss.getSheetByName(SHEET_NAME);
  if (!sheet) {
    Logger.log("指定されたシートが見つかりませんでした。");
    return null;
  }

  // シート内のグラフを取得
  var charts = sheet.getCharts();
  if (charts.length == 0) {
    Logger.log("グラフが見つかりませんでした。");
    return null;
  }

  try {
    var chart = charts[0]; // 最初のグラフを取得
    var blob = chart.getBlob(); // グラフをBlobオブジェクトとして取得
    var fileName = SHEET_NAME + '_' + Utilities.getUuid() + '.png'; // ファイル名を生成
    var file = folder.createFile(blob.setName(fileName)); // Blobをファイルとして保存
    return file.getUrl(); // 保存したファイルのURLを返す
  } catch (error) {
    Logger.log("エラーが発生しました: " + error.toString()); // エラーが発生した場合の処理
    return null;
  }
}

このコードは、指定されたGoogleスプレッドシートから特定のシートを選択し、そのシートにある最初のチャートを画像としてGoogle Driveに保存します。保存された画像のURLは、関数の戻り値として返すものです。

グラフの違いによる影響

この問題を解決するために、2種類のグラフを用意し、それぞれの動作を確認しました。一つは複合グラフ、もう一つは横棒グラフです。元々は複合グラフを使って、予算、実績、予算差、達成率を表現しようとしていましたが、上記の例外により、横棒グラフを使った代替案に切り替えました。

問題となった2軸の複合グラフ
代替策とした棒グラフ
複合グラフと横棒グラフのオプション(初期設定から変更は少ないがエラーとなった)

一般的な原因とは異なる

「Service Spreadsheets failed while accessing document with id」というエラーメッセージは、以下の原因で発生することがあります。

  • 無効なスプレッドシートID

  • アクセス権限の不足

  • APIの制限

  • ネットワークやサービスの問題

これらの原因に加えて、私が経験したのは、複雑なチャートを作成した場合に発生する特有の問題でした。解決策を見つけるのは困難でしたが、これを通じて新たな経験ができたので良かったとします。

まとめ

Google Apps Script(GAS)を用いたサービス開発は、私にとって新しい分野です。この経験は、特に貴重なものとなりました。社内でノーコード処理を実施する中で、解決できない問題に遭遇することがあります。そうした時、コーディングによる対策が必要になるわけですが、今回GASを使ったWEBHOOKの作成に挑戦できたことは、技術的な進歩を意味します。これにより、より多くの課題に対して、手軽にプログラミングで対応できるようになったのは、大きな収穫です。

この記事が気に入ったらサポートをしてみませんか?