Google formの回答を自動的にSlackに送信するシステムをGASで実装する

# GoogleフォームからSlackへの自動投稿をGASで実現する方法

Googleフォームの回答を自動的にSlackの特定チャンネルへ送信する仕組みを構築する方法について解説します。この記事では、Google Apps Script (GAS) を使用して、GoogleフォームとSlackを連携するコードを作成します。

---

## はじめに

Googleフォームは便利ですが、回答内容をリアルタイムで確認するには手動でスプレッドシートをチェックする必要があります。これを自動化することで、回答が送信されたらすぐにSlackに通知が届く仕組みを構築できます。これにより、回答確認の効率が大幅に向上します。

この記事では以下を実現します：
1. Googleフォームに回答が送信されたらトリガーを発火
2. Google Apps Script (GAS) を用いてSlack API(Incoming-webhook)によってSlackの特定のチャンネルに回答内容を送信

---

## 必要な準備

### 1. Googleフォームとスプレッドシートの準備
1. Googleフォームを作成します。
2. 回答の保存先をスプレッドシートに設定します。
   - Googleフォームの設定画面で「回答」タブを開き、「スプレッドシートの作成」を選択します。

### 2. SlackのWebhook URLを取得
1. Slackのワークスペースの画面を開きます。
2. 左側にあるその他を選択して、自動化からAppという項目を選択します。
3. 検索の部分に「Incoming WebHooks」と入力して、追加を選択
 ※ すでにいくつかAppが追加されてる場合はしばらくスクロールすれば表示されるはずです。
4. Slackのサイトに遷移したら「Slackに追加」を選択し、その後「チャンネルを選択」というところで、Google formの回答を送信したいチャンネルを選択しましょう。
5. 追加し終わったら、しばらくスクロールしたら表示される「Webhool URL」をコピーしてどこかに保存しておきましょう。
 - 例：https://hooks.slack.com/services/T〇〇〇〇〇〇〇〇/B〇〇〇〇〇〇〇〇/W〇〇〇〇〇〇〇〇

---

## コードの実装

### 1. GASのスクリプトエディタを開く
1. Google formの回答が紐づいたスプレッドシートを開きます。
2. メニューから「拡張機能」 > 「Apps Script」を選択します。

### 2. GASコードを記述
以下のコードをGoogle Apps Scriptのスクリプトエディタに貼り付けてください：

```javascript
const SLACK_WEBHOOK_URL = 'https://hooks.slack.com/services/T〇〇〇〇〇〇〇〇/B〇〇〇〇〇〇〇〇/W〇〇〇〇〇〇〇〇'; //先ほど保存したWebhool URLを貼り付け
const TARGET_SHEET_NAME = ''; // 対象のシート名を指定

function onFormSubmitES(e) {
  // デバッグ用のログを追加
  Logger.log('Event Object: %s', JSON.stringify(e));
  
  // e.values が存在しない場合は処理を終了
  if (!e || !e.values) {
    Logger.log('Error: Event object or e.values is undefined.');
    return;
  }

  // フォームの回答が記録されたシートを取得
  const sheet = e.range.getSheet();

  // 対象のシートかどうかを確認
  if (sheet.getName() !== TARGET_SHEET_NAME) {
    Logger.log('This event is not for the target sheet. Sheet name: ' + sheet.getName());
    return;
  }

  // フォームの回答が記録された行を取得
  const responses = e.values;

  // Slackに送信するメッセージを作成
  const message = {
    text: 'これはB列の質問の回答です。: ' + responses[1] + '\n' + 
          'これはC列の質問の回答です。: ' + responses[2] + '\n' + 
          'これはD列の質問の回答です。: ' + responses[3] + '\n' + 
          'これはE列の質問の回答です。: ' + responses[4] + '\n'
  };

  // Slackにメッセージを送信
  UrlFetchApp.fetch(SLACK_WEBHOOK_URL, {
    method: 'POST',
    contentType: 'application/json',
    payload: JSON.stringify(message)
  });
}

function setUpTrigger() {
    // トリガーを設定
  const sheet = SpreadsheetApp.getActiveSpreadsheet();
  ScriptApp.newTrigger('onFormSubmit')
           .forSpreadsheet(sheet)
           .onFormSubmit()
           .create();
}

```

### コードの詳細説明
1. **Webhook URLの指定**
   - `SLACK_WEBHOOK_URL` には、先ほど取得したWebhook URLを設定します。


2. **シートの名前の指定**
      - `TARGET_SHEET_NAME` には、Google formをスプシに紐付けた際のシートの名前を記入しましょう。
3. **Slack通知用メッセージの選択**
   - `response[i]`はiの数字によってスプシから取得する場所が変わります。おそらくスプシをいじっていなければA列に`タイムスタンプ`がきているはずなので、B列から回答を取得します。
   - B列の情報を取得したい場合は、iに1を。C列の情報を取得したい場合は、iに2を入れましょう。それ以降のアルファベットに関しては数字を1ずつ増やしていけば対応できるかと思います。

3. **Slack通知用メッセージの作成**
   - Backtick（`` ` ``）を使ってテンプレート文字列でメッセージを構築します。
   - 改行には `\n` を使用します。

4. **Slack APIへのリクエスト**
   - `UrlFetchApp.fetch` を使用してSlackのWebhookにPOSTリクエストを送信します。
   - メッセージ本文は `JSON.stringify` を使ってJSON形式に変換します。

---

### 3. GASでのトリガーの設定
1. スクリプトエディタのサイトバーから「トリガー」アイコンをクリックします。
2. 右下にある「トリガーを追加」から以下の設定を行います：
   - **実行する関数**: `onFormSubmit`
   - **実行するデプロイ**: `head`
   - **イベントのソースを選択**: スプレッドシートから
   - **イベントの種類を選択**: フォーム送信時
   - そして、右下の保存ボタンを押して、保存完了
3. トリガー設定後、スクリプトエディタに戻り「保存」もしくは「Command + S」（Macの場合）をクリックします。

---

## 注意点

1. **Webhook URLの安全性**
   - Webhook URLは外部に公開しないでください。公開されると不正利用される可能性があります。

2. **フォームの質問変更時の対応**
   - フォームの質問内容や順番が変更された場合、コード内のインデックス番号（`responses[1]` など）を更新する必要があります。

---

## 結果の確認

Googleフォームに回答を送信し、指定したSlackチャンネルに通知が届くことを確認します。

---

## おわりに

この記事では、GoogleフォームとSlackを連携する方法について解説しました。この仕組みを活用することで、リアルタイムな通知が可能になり、業務の効率化が期待できます。ぜひ試してみてください！GASからのメンションの仕方などは時間があれば別の記事にまとめるので、よければそちらも参考にしてみてください！

---

## 参考リンク
- [Google Apps Scriptドキュメント](https://developers.google.com/apps-script)
- [Slack APIドキュメント](https://api.slack.com/)