# GASサンプル：フォーム回答 → Slack／メール通知 ＋ 集計シート自動更新

> 「スプレッドシート／GAS／Excel自動化（¥5,000〜）」の納品サンプルです。
> Googleフォームの回答が届くたびに、Slack とメールに通知し、集計シートを自動で更新します。

## できること

| 機能 | 内容 |
|---|---|
| Slack通知 | 回答内容を Incoming Webhook で指定チャンネルに投稿 |
| メール通知 | 回答内容を指定アドレス（複数可）に送信。件名に1問目の回答が入る |
| 集計シート | 累計・今日・直近7日・直近30日の件数、日別件数（30日）、選択式設問ごとの内訳を自動生成 |
| 安全設計 | URLやアドレスはコードに書かずスクリプトプロパティで管理。通知・集計のどれかが失敗しても他は実行され、失敗内容はログに残る |

## 導入手順（所要10分）

### 1. フォームとスプレッドシートをつなぐ
1. Googleフォームを開き、「回答」タブ → スプレッドシートのアイコンをクリック
2. 「新しいスプレッドシートを作成」を選ぶ（既存のものでも可）
3. 作成されたスプレッドシートを開く。「フォームの回答 1」というシートがあることを確認

### 2. スクリプトを貼り付ける
1. スプレッドシートのメニュー「拡張機能」→「Apps Script」
2. 開いたエディタの `コード.gs` の中身をすべて削除し、同梱の `Code.gs` の内容を貼り付ける
3. 上部の保存アイコン（またはCtrl+S）で保存

### 3. 通知先を設定する（スクリプトプロパティ）
1. エディタ左の歯車アイコン「プロジェクトの設定」をクリック
2. 一番下の「スクリプト プロパティ」→「スクリプト プロパティを追加」
3. 次のプロパティを追加（不要なものは追加しなくてよい）

| プロパティ名 | 値の例 | 説明 |
|---|---|---|
| `SLACK_WEBHOOK_URL` | `https://hooks.slack.com/services/...` | Slack の Incoming Webhook URL。取得方法は下記 |
| `NOTIFY_EMAIL` | `you@example.com, team@example.com` | 通知先メール。カンマ区切りで複数可 |
| `SUMMARY_SHEET` | `集計` | 集計シート名（省略可） |
| `SUBJECT_PREFIX` | `[お問い合わせ]` | メール件名の先頭（省略可） |

**Slack Webhook URL の取得：** Slack の「アプリ」→「Incoming Webhook」を追加 → 投稿先チャンネルを選択 → 表示された URL をコピー。この URL は投稿権限そのものなので、他人に共有しないでください。

### 4. トリガーを作成する
1. エディタ上部の関数選択で `setupTrigger` を選び「実行」
2. 初回は権限の承認画面が出る → 自分のアカウントを選び「詳細」→「（プロジェクト名）に移動」→「許可」
3. 実行ログに「トリガーを作成しました」と出れば完了

### 5. 動作確認
- フォームから1件テスト送信する
- または、回答が1件以上ある状態で関数 `testWithLastResponse` を実行（最新の回答で通知と集計を試す）
- Slack／メールに通知が届き、「集計」シートが作られていれば成功

## 集計シートの見方

```
項目            件数
累計回答数      128
今日            3
直近7日         21
直近30日        74
最終更新        2026-09-08 10:12:34

日別回答数（直近30日）  件数
2026-08-10              2
...

内訳: お問い合わせ種別   件数
資料請求                 52
見積依頼                 41
その他                   35
```

- 「内訳」は、回答の種類が12種類以下の設問（ラジオボタン・プルダウン・チェックボックス）だけ自動で作られます。自由記述は対象外です
- 集計は毎回作り直すので、回答を削除・修正しても数字が正しく保たれます

## カスタマイズのヒント

| やりたいこと | 変更箇所 |
|---|---|
| 内訳を作る設問の上限を変える | `MAX_DISTINCT_FOR_BREAKDOWN` の数値 |
| 日別集計の期間を変える | `DAILY_WINDOW_DAYS` の数値 |
| 通知文の形式を変える | `buildMessageText` 関数 |
| 特定の回答だけ通知する（例：「至急」を含むとき） | `onFormSubmitHandler` の先頭で `record.fields` を見て `return` する |
| Chatwork／LINE に通知する | `notifySlack` を参考に、各サービスの API へ `UrlFetchApp.fetch` する関数を追加 |

## トラブルシューティング

| 症状 | 原因と対処 |
|---|---|
| 通知が届かない | 「実行数」（エディタ左の時計アイコン）でエラーを確認。`SLACK_WEBHOOK_URL` / `NOTIFY_EMAIL` の綴りとプロパティ名を確認 |
| 「回答シートが見つかりません」 | フォームとスプレッドシートがリンクされているか確認（手順1） |
| 権限エラー | `setupTrigger` を再実行し、承認画面で「許可」を選ぶ |
| メールが1日の上限に達した | 無料 Gmail は1日100通まで。Workspace は1,500通。上限に近い場合は Slack 通知のみにする |
| 集計シートが古い | 関数 `rebuildSummaryOnly` を実行すると通知なしで集計だけ作り直せます |

## 注意事項

- 回答に個人情報が含まれる場合、Slack チャンネルの公開範囲にご注意ください
- Webhook URL やメールアドレスをコードに直接書かないでください（スプレッドシートを共有した相手に見えてしまいます）
- 本サンプルは Google Apps Script の V8 ランタイムで動作します（2020年以降の標準設定）

## 納品時に含まれるもの（実際のご依頼の場合）

- お客様のフォーム項目に合わせて調整した `Code.gs`
- 上記と同様の導入手順書（スクリーンショット付き）
- 導入後7日間のメールサポート（設定のつまずき対応）
