【初心者向け】ChatGPTを使ってスプレットシートで作ったグラフをSlackに定期投稿するGASを書いてみた。

ChatGPTを使ってGoogle Apps Script(GAS)を書けるようになりたい!」という声をよく耳にします。そこで今回は「スプレットシードのグラフをslackに投稿するgas」をchatGPTに書かせてみたので、そのプロセスをご紹介致します。

一般的に、Slackに通知やグラフ画像を自動投稿したいと考える方は多いのですが、2024年以降はSlack APIの「files.upload」が非推奨となり、古いコードではエラーが出てしまうケースが増えています。実際に私自身も、ChatGPTにコード生成を依頼すると files.upload を含むサンプルが返ってきて、そのままでは動かない…という経験を何度もしてきました。

そこで本記事では、その解決策を備忘録も兼ねて「ChatGPTにどのようなプロンプトを投げれば正しいGASが出力されるのか」そしてSlack連携に対応したコードはどのように書けばよいのかを、具体例とともに解説します。GASによる自動化を効率的に進めたい方や、ChatGPTを業務改善に活用したい方にとって参考になる内容です。

当ブログがオススメする

業務自動化サービスランキング

なお、業務効率化や工数削減を目指しているものの、どの業務から自動化すべきか、どのツールや手段が自社に合っているのかがあいまいな方は、「業務自動化プラン診断」をお試しください。

かかる時間は1分ほど。4つの質問に答えるだけで、あなたに最適な自動化対象業務や、推奨される自動化手段を診断してもらえます。

効率よく自社に適した業務効率化を知りたい方は、ぜひ一度お試しください。

\ 4つの質問に答えるだけ /

目次

完成イメージ

Step1:スプレットシートに「graph」シートを用意する。

「graph」シートを作成しSlackに投稿したいグラフを載せる。

Step2:ChatGPTを使って、Google Apps Scriptを書く。

ChatGPTにて以下のプロンプトを入力する。

あなたはGoogle Apps Scriptを得意としたプロのエンジニアです。

目の前に
「graph」
という名前のシートを含んだスプレットシートがあります。

graphシートにはグラフが作成されており、
google apps scriptを使ってslackに投稿したいです。
このとき、slack上でpreviewで表示されるようにしたいです。

コードを書いていただけますか?

また、2024年以降は files.upload が非推奨なので
files.getUploadURLExternal
files.completeUploadExternal
を使ってください。

そうすると以下のようなコードが出力される。

※ChatGPT等のLLMではアウトプットを100%コントロールすることができないので下記のコードと全く同じものが出力されるとは限りません。もし必要あれば以下のコードをコピペして、取り組んでください。

/**
 * 「graph」シートの最初のグラフをPNG化してSlackに投稿(プレビュー表示)する
 * 2024年以降推奨のExternal Uploadフローを使用
 */
function postGraphChartToSlack() {
  // ===== 設定(置き換えてください) =====
  const SLACK_BOT_TOKEN = 'xoxb-xxxxxxxxxxxxxxxxx'; // ボットトークン
  const CHANNEL_ID = 'CXXXXXXXX';                  // 投稿先チャンネルID(例: C01ABCDEF)
  const INITIAL_COMMENT = '本日のグラフです 📊';       // メッセージ本文(任意)
  const SHEET_NAME = 'graph';                      // グラフがあるシート名
  // =====================================

  // 1) SheetsのグラフをPNG Blobにする
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName(SHEET_NAME);
  if (!sheet) throw new Error(`シート「${SHEET_NAME}」が見つかりません。`);
  const charts = sheet.getCharts();
  if (!charts.length) throw new Error(`シート「${SHEET_NAME}」に埋め込みグラフがありません。`);

  const chart = charts[0]; // 必要に応じてインデックスを変更
  const pngBlob = chart.getAs(MimeType.PNG).setName('graph.png'); // PNG化(プレビュー可)

  // 2) アップロードURLを取得(files.getUploadURLExternal)
  const getUrlRes = UrlFetchApp.fetch('https://slack.com/api/files.getUploadURLExternal', {
    method: 'post',
    headers: { Authorization: `Bearer ${SLACK_BOT_TOKEN}` },
    payload: {
      filename: pngBlob.getName(),
      length: String(pngBlob.getBytes().length), // バイト数
    },
    muteHttpExceptions: true,
  });
  const getUrlJson = JSON.parse(getUrlRes.getContentText());
  if (!getUrlJson.ok) {
    throw new Error(`getUploadURLExternal 失敗: ${getUrlRes.getContentText()}`);
  }
  const uploadUrl = getUrlJson.upload_url;
  const fileId = getUrlJson.file_id;

  // 3) 取得したURLに実体をアップロード(POST・生バイトでOK)
  const uploadRes = UrlFetchApp.fetch(uploadUrl, {
    method: 'post',
    contentType: 'application/octet-stream',
    payload: pngBlob.getBytes(),
    muteHttpExceptions: true,
  });
  const code = uploadRes.getResponseCode();
  if (code < 200 || code >= 300) {
    throw new Error(`ファイルアップロード失敗(HTTP ${code}): ${uploadRes.getContentText()}`);
  }

  // 4) アップロード完了宣言(files.completeUploadExternal)+チャンネルに共有
  const completeRes = UrlFetchApp.fetch('https://slack.com/api/files.completeUploadExternal', {
    method: 'post',
    headers: {
      Authorization: `Bearer ${SLACK_BOT_TOKEN}`,
      'Content-Type': 'application/json; charset=utf-8',
    },
    payload: JSON.stringify({
      files: [{ id: fileId, title: 'graph.png' }], // タイトルは任意
      channel_id: CHANNEL_ID,                      // 指定するとチャンネルに共有される
      initial_comment: INITIAL_COMMENT,            // メッセージ本文(任意)
    }),
    muteHttpExceptions: true,
  });
  const completeJson = JSON.parse(completeRes.getContentText());
  if (!completeJson.ok) {
    throw new Error(`completeUploadExternal 失敗: ${completeRes.getContentText()}`);
  }

  // (任意)戻り値としてファイル情報をログ
  Logger.log(completeJson);
}

Step3: (必要ならば)投稿先のSlackのチャンネルを作成する。

グラフを投稿する先のチャンネルをまだ作成されていない場合は、以下の「チャンネルを追加する」から作成してください。

Step3: Slack Appを作成し、tokenを取得する

Slack Appの設定をStepごとに大まかに説明すると以下の流れになります。

STEP
Slack Appを作成する

Developer画面からオリジナルのアプリを作成。

STEP
Incoming WebhooksをOnにする

初期作業としてIncoming webhooksをactivateする

STEP
AppのDisplay Nameを設定する

Display Nameを設定しないとAppをinstallできない挙動が確認されているので、Display Nameを設定する。

STEP
Slackに作成したAppをinstallする

Slack上から作成したオリジナルのAppをinstallする。

STEP
AppのScope等の設定を行い、reinstallする

作成したAppがSlackに対してどのようなことができるのか制限をかける。(今回は「書く」という動作の許可を与えます。)

STEP
Slackの特定のチャンネルにAppをチャネルに追加する

作成したオリジナルAppをSlack自体に追加する。

STEP
Tokenを取得する

準備が整ったので、Developer画面からTokenを取得する、

Step3-1: Slack Appを作成する

Slack Developer ページにアクセスし、Your apps を押す。

Create New Appをクリック

「From scratch」を押し、「AppName」にお好きなアプリの名前、「Pick a workspace to develop your app in: 」にBotを追加したいWorkspaceを選択し、Create Appを押します。

Step3-2: Incoming WebhooksをOnにする

「Incoming Webhooks」ページに遷移し、Activate Incoming WebhooksをOnにする。

Step3-3: AppのDisplay Nameを設定する。

「Display Name」にslack上に表示される名前を入力し、「Default username」は何でも問題ないのですが、適切な名前を英語で入力し、最後に「Save」を押します。

「Incoming Webhooks」ページに遷移し、Activate Incoming WebhooksをOnにする。

Step3-4: Slackに作成したAppをinstallする

「OAuth & Permissions」のページに遷移し、「Install to 〇〇」をクリックして自社のSlack Workspaceにインストールする。

Step3-5: AppのScope等の設定を行い、reinstallする

「OAuth & Permission」ページを選択し、Scopesの段落までページを下部にスクロールし、「Add an OAuth Scope」をクリックする。

「fies:write」を追加する。

最初に設定したときと同じチャンネルを選択し、「許可する」を押す。

Step3-6: Slackの特定のチャンネルにAppをチャネルに追加する

Slack Appをチャネルに追加する。

Step3-7: Tokenを取得する。

下記のようなTokenを取得できたら、手元にコピーしておく。

xoxb-xxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

必要な要素が
①Slackのtoken
②SalckのチャネルID

の2点になり、これは1つめになります!

他人に知られないように十分注意しておきましょう!

Step4: 投稿したいslackのチャネルIDを取得する

https://app.slack.com/client/XXXXXXXXXX/C00000000

URLに着目すると、チャンネルごとにURLが異なることに気付きます。どのチャンネルなのかをURL上では

C00000000

の部分で判別することができます。これのことをチャンネルIDと呼びます。

投稿したいチャンネルのチャンネルIDを取得し手元に用意しておきます。

このチャネルIDが、必要な要素
①Slackのtoken
②SalckのチャネルID

のうちの2つめになります!

Step5: Google Apps Scriptのコードを完成させる

  // ===== 設定(置き換えてください) =====
  const SLACK_BOT_TOKEN = 'xoxb-xxxxxxxxxxxxxxxxx'; // ボットトークン
  const CHANNEL_ID = 'CXXXXXXXX';                  // 投稿先チャンネルID(例: C01ABCDEF)
  const INITIAL_COMMENT = '本日のグラフです 📊';       // メッセージ本文(任意)
  const SHEET_NAME = 'graph';                      // グラフがあるシート名
  // =====================================

上記の部分の

  const SLACK_BOT_TOKEN = 'xoxb-xxxxxxxxxxxxxxxxx'; // ボットトークン

  const CHANNEL_ID = 'CXXXXXXXX';                  // 投稿先チャンネルID(例: C01ABCDEF)

の部分にそれぞれ、手元に記入したslack TokenチャネルIDを入力し、google Apps Scriptのコードを完成させます。

Step6: 初回だけ手動で実行し、権限を承認する

Google Apps scriptの場合、初回の実行時だけユーザーの許可が必要となります。

許可するためには以下の流れで許可することができます。

①対象のfunctionが選択されているようにする。

②「実行」ボタンを押す。

初回だと以下のようなポップアップが表示されます。

ここで「権限を確認」を押します。

自分のアカウントを選択します。

今回のfunctionではスプレットシートのグラフを取得し、それをslackに投稿するという内容になるため、以下の画像のようなアクセスできる情報を選択する必要があります。今回のようなfunctionでないにしても、基本的にこの場合は「すべて選択」にチェックボックスを入れてすべて承認してしまって問題ありません。

「続行」を押すと、Google Apps Scriptの画面になると思います。

以下のように実行内容に関するログが表示され、「実行完了」の文字が出現したら、問題なくfunctionが実行されたことを意味します。

指定したSlackのチャンネルを見ると、以下のようにグラフが投稿されていると思います。

正しくGoogle Apps Scriptを書けていればこのような状態になります。

Step7: トリガーを設置し、毎日定期的にslackにグラフが送られるように設定する。

先程までの段階では、GASを書いてるとはいえ手動でslackに投稿しました。

これを例えば「何もせずに朝起きたらグラフが投稿されるようにしたい」という場合は、トリガーを設置すれば毎朝自動で投稿されるように設定できます。

google Apps Scriptの左側のメニューより、時計のマークのトリガーを押下し、「+ トリガーを追加」を押します。

「+トリガーを追加」を押すと、以下のようなダイアログが出現します。

イベントのソースを選択:時間主導型
時間ベースのトリガーのタイプを選択:日付ベースのタイマー
時刻を選択:お好きな時間帯

となるように設定し、「保存」ボタンを押下する。

すると、以下のように新規のトリガーが追加された状態になる。このようにトリガーが新規追加されていればOKです。

このように設定できれば、明日から毎日6-7時の間にスプレットシートのgraphシートに載っているグラフを画像としてslackに投稿することができるようになります。

なかなかうまくいかないときは?

プログラミングが未経験の方にとっては少しハードルが高く「諦めるしかない⋯」と挫折するきっかけを生みかねません。

「社内で自動化したは良いものの、自分がやめたら引き継ぐ人がいない⋯」

「一つ自動化したら、他部署からも自動化を依頼されて自分の仕事が進まない⋯」

と不安な方もいますよね。

そこで、おすすめしたいのが「ジドウカ」です。

ジドウカは、これまで合計800タスク以上の業務の自動化をしてきた実績のある法人専用の自動化サービスです。

業務の一部を“タスク単位”で自動化し、【月額1万円から】安定運用できるサブスクリプション型のサービスです。 タスクを外注するため手離れもよく、技術のことが分からなくても、「こういう作業をラクにしたい」と伝えるだけで自動化することが可能です。

「わたしが自動化したい内容って自動化できるんだろうか⋯」という方には、少額・短期間での「お試し開発」があるので、お気軽にご活用ください。

まとめ

本記事では「Slackにグラフを自動投稿する方法」を例に、ChatGPTを使ってGoogle Apps Script(GAS)のコードを生成し、実際に業務自動化を実現する流れを紹介しました。

重要なのは、もはやGASを一から自分で書けなくても、ChatGPTやGemini、Claudeといった最新のLLMを活用すれば必要なコードを自動生成できる という点です。ちょっとした工夫で「実務にそのまま使えるコード」を得られるようになり、これまでプログラミングに不慣れだった方でも業務自動化に踏み出せます。

今回のSlack連携に限らず、

  • 毎日のレポート作成を自動化したい
  • データを整形してSlackやメールに通知したい
  • シートを定期的に更新・バックアップしたい

といった幅広いシーンで、「プロンプトを工夫してLLMに頼る」だけで、自分専用のGASを手に入れられる のです。

ぜひ今日から「全部自分でコードを書く」という発想を手放し、LLMを業務効率化の強力な相棒として取り入れてみてください。

もし「自分で試したけどうまく動かない」「もっと複雑な処理も自動化したい」という場合は、ぜひ一度ご相談ください。弊社の業務自動化サービス 「ジドウカ」 では、ChatGPTやGASを組み合わせたオーダーメイドの自動化をサポートしています。資料請求や無料相談も可能ですので、お気軽にお問い合わせください。

目次