Googleフォームの回答を、メールではなくLINEにリアルタイム通知したい。そう思ったことはありませんか。
私はフォームの通知をメールで受け取っていた頃、気づくのがいつも数時間後でした。メールは埋もれます。一方でLINEなら、回答が入った瞬間にスマホが鳴ります。
この記事では、GAS(Google Apps Script)とLINE Messaging APIを使い、フォーム回答をLINEに自動通知する方法を解説します。コードはすべて私が実際に動かして確認したものです。無料で、自分の手で作れます。
なお「まずはメール通知で十分」という方は、先にフォーム回答を自動メール通知する記事から読むとスムーズです。
なぜフォーム回答は「LINE通知」が便利なのか
フォームの通知手段はいくつかありますが、私はLINE通知を一番よく使っています。理由は「気づく速さ」が段違いだからです。
メール通知は確実ですが、他のメールに埋もれて開くのが後回しになりがちです。返信が必要な問い合わせほど、この遅れが痛くなります。
その点、LINE通知はスマホのプッシュで即座に届きます。移動中でも回答内容をその場で確認でき、対応の初動が速くなります。個人事業や小さなチームの問い合わせ受付と、とても相性が良い仕組みです。
もちろんZapierやMakeなどの有料SaaSでも同じことは実現できます。ただ月額費用がかかりますし、無料枠には実行回数の制限があります。
GASなら、Googleアカウントさえあれば費用ゼロです。外部サービスに依存せず、自分のコードとして中身を把握できるのも安心材料になります。この「無料・自前」という立ち位置が、GASでLINE通知を組む一番の価値だと私は考えています。
準備するもの(3つ)
作り始める前に、必要なものを先に揃えます。GASでLINE通知を作るのに用意するのは次の3つだけです。
- Googleフォーム(回答を受け取るフォーム。既存のものでOK)
- LINE Messaging APIのチャネル(LINE Developersで作成)
- チャネルアクセストークン(GASからLINEへ送信する鍵)
このうち手間がかかるのは2と3です。とはいえ一度作れば使い回せます。順番に見ていきます。
LINE Developersでチャネルを作りトークンを取得
まずLINE Developersにログインし、プロバイダーを作成します。次にそのプロバイダーの中で「Messaging API」チャネルを新規作成します。
チャネルができたら、管理画面の「Messaging API設定」タブを開きます。ページ下部にある「チャネルアクセストークン(長期)」を発行してください。この長い文字列が、GASからメッセージを送るための鍵になります。
私は以前、LINE秘書ボットを作ったときに同じ手順でチャネルを取得していました。今回はそのチャネルとトークンをそのまま流用しています。すでにMessaging APIチャネルを持っているなら、新規作成は不要です。
なおトークンは他人に知られると悪用されます。SNSやブログにそのまま貼らないよう注意してください。安全な保存方法は後ほど解説します。
通知先(自分に送る)の決め方
LINE Messaging APIで自分に通知する方法は、大きく2つあります。「broadcast」と「push」です。
broadcastは、チャネルを友だち追加した全員に送る方式です。トークンだけで動くので設定が最も簡単です。個人で自分だけが友だちなら、実質「自分専用の通知」になります。
pushは、特定のユーザーやグループを指定して送る方式です。宛先のIDが必要で、取得にひと手間かかります。
個人の通知用途なら、私はbroadcastをおすすめします。今回のコードもbroadcastで作ります。事前に、自分のLINEでそのチャネルを友だち追加しておいてください。これが通知の届き先になります。
GASでフォーム回答をLINEに通知するコード
ここからが本題です。実際に私が動かして通知を確認したコードをそのまま載せます。コピペして、後述する設定を数か所行えば動きます。

スクリプトを貼る(回答整形→LINE送信)
まず、通知したいGoogleフォームを開き、右上の「⋮」→「Apps Script」からスクリプトエディタを開きます。フォームから開くと、スクリプトがそのフォームに紐づきます。
そこに、次のコードを丸ごと貼り付けてください。
// ① 権限を確実に要求させる"おまじない"
function _ensureFormPermission() {
FormApp.getActiveForm();
}
// ② フォーム送信時に実行(トリガーで登録する関数)
function onFormSubmit(e) {
try {
_ensureFormPermission();
var itemResponses = e.response.getItemResponses();
var timestamp = e.response.getTimestamp();
var message = buildMessage(itemResponses, timestamp);
sendLineBroadcast(message);
Logger.log("LINE通知を送信しました: " + timestamp);
} catch (error) {
Logger.log("エラー: " + error.toString());
}
}
// ③ 回答を通知本文に整形
function buildMessage(itemResponses, timestamp) {
var when = Utilities.formatDate(timestamp, "JST", "yyyy/MM/dd HH:mm");
var lines = ["🔔 新しいフォーム回答", "🕒 " + when, ""];
itemResponses.forEach(function (item) {
lines.push("■ " + item.getItem().getTitle());
lines.push(item.getResponse());
lines.push("");
});
return lines.join("\n").trim();
}
// ④ LINE Messaging API の broadcast で送信
function sendLineBroadcast(text) {
var token = PropertiesService.getScriptProperties()
.getProperty("LINE_CHANNEL_ACCESS_TOKEN");
if (!token) {
throw new Error("LINE_CHANNEL_ACCESS_TOKEN が未設定です");
}
var url = "https://api.line.me/v2/bot/message/broadcast";
var payload = { messages: [{ type: "text", text: text }] };
var options = {
method: "post",
contentType: "application/json",
headers: { Authorization: "Bearer " + token },
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
var res = UrlFetchApp.fetch(url, options);
var code = res.getResponseCode();
Logger.log("LINE応答: " + code + " " + res.getContentText());
if (code !== 200) {
throw new Error("LINE送信失敗 HTTP " + code + " / " + res.getContentText());
}
}
// ⑤ 動作確認用(フォームを送らずにテスト送信)
function testBroadcast() {
sendLineBroadcast("✅ テスト通知:GASからのbroadcast疎通確認");
}
やっていることはシンプルです。フォーム送信で受け取った回答を、質問と答えのペアに整形し、LINEへPOSTしています。通知本文には送信時刻もJSTで入れています。
トークンはスクリプトプロパティに安全保存
コードにトークンを直接書く(直書き)のは避けてください。コードを共有したときに漏れますし、GitHubに上げれば一発でアウトです。
GASには「スクリプトプロパティ」という安全な保管場所があります。ここに入れておけば、コードにはキー名だけを書いて呼び出せます。
設定はエディタ左下の「プロジェクトの設定」⚙️から行います。「スクリプト プロパティ」の項目で、次のように登録して保存してください。
- プロパティ(キー名):
LINE_CHANNEL_ACCESS_TOKEN - 値:発行したチャネルアクセストークン
キー名は上のコードが参照している名前です。1文字も変えず、前後に空白が入らないように貼り付けてください。ここがずれると、通知が届かずに認証エラーになります。
onFormSubmitトリガーを設定して自動化
コードとトークンを用意しても、そのままでは自動実行されません。「トリガー」を登録して、フォーム送信と関数を結びつける必要があります。
ここで大事なのが、単純トリガーではなくインストール型トリガーを使うという点です。フォーム送信を安定して検知するには、手動でのトリガー登録が必要になります。
エディタ左メニューの「⏰トリガー」を開き、右下の「トリガーを追加」を押します。次のように設定してください。
- 実行する関数:
onFormSubmit - イベントのソース:「フォームから」
- イベントの種類:「フォーム送信時」
保存すれば設定完了です。あとはフォームに回答が入るたびに、LINEへ自動で通知が飛びます。
私がつまずいたポイントと対処
ここが、私が実際に手を動かしたからこそ書ける部分です。GASでフォーム連携を組むと、初心者がほぼ確実に踏む落とし穴がいくつかあります。
1. スクリプトエディタが開けない。「現在ファイルを開くことができません」と出て開けないことがあります。原因はGoogleアカウントの複数同時ログインでした。シークレットウィンドウで対象アカウント1つだけログインして開くと、一発で解決します。
2. フォームが「回答を受け付けていません」。新しいGoogleフォームでは、以前あった「回答を受付中」トグルが廃止されました。右上の紫の「公開」ボタンを押さないと回答を受け付けません。古いチュートリアルの多くはこの変更に追いついていません。
3. プレビューでは送信できない。編集画面のプレビュー(👁️)で回答しようとすると送信できません。テストは必ず、回答用リンク(公開URL)から開いた本物のフォームで行ってください。
4. 外部通知が急に届かなくなる(最大の罠)。GASの承認画面は「コードが明示的に呼ぶAPI」の権限しか要求しません。e.responseは内部処理のため静的解析で検出されず、フォームの読み取り権限が落ちることがあります。私は以前これでチャット通知が届かず、実行ログの権限エラーで原因を突き止めました。
対処は、コードの先頭にFormApp.getActiveForm();を1行足すことです。この明示呼び出しでフォーム権限が検出され、承認画面に「Googleフォーム」が出ます。今回のコードにあらかじめ組み込んでおいたおかげで、私はこの罠を踏まずに一度で通せました。
応用:メール併用・複数宛先・Flex Message
回答者本人へメールで自動返信したい場合は、Googleフォームの回答者に自動返信メールを送る方法(GAS)もあわせてどうぞ。通知先を「自分」から「回答者」に変えるイメージです。
なお、個人ではなくチームで受け取るなら、SlackやDiscordへ通知する方法も便利です。Googleフォーム回答をSlack/Discordへ通知する方法で、Incoming Webhookを使った実装を解説しています。
基本形が動いたら、用途に合わせて広げられます。
メール通知と併用したいなら、メール通知の記事のコードと組み合わせ、sendLineBroadcastとGmailApp.sendEmailを両方呼ぶだけです。記録はメール、即応はLINE、と役割を分けられます。
複数人に通知したい場合は、broadcastならチャネルを友だち追加した全員に届きます。特定の人だけに送りたいならpush方式に切り替え、宛先IDを指定します。
さらにリッチにするなら、テキストではなくFlex Messageを使う方法もあります。ボタンや画像を並べた通知にできます。将来的にはClaude APIと組み合わせ、問い合わせ内容から返信文案まで生成する、といった発展も可能です。
まとめ
GASを使えば、フォーム回答をLINEに自動通知する仕組みを無料で自作できます。要点を整理します。
- 準備は「フォーム・Messaging APIチャネル・アクセストークン」の3つ
- 個人用途の通知先はbroadcastが手軽。トークンはスクリプトプロパティに安全保存する
- インストール型のonFormSubmitトリガーで自動化し、テストは回答リンクから行う
最初は権限まわりで少し戸惑うかもしれません。ですが一度通せば、あとは回答が入るたびにLINEが鳴る快適な環境が手に入ります。ぜひ手を動かして試してみてください。
この仕組み、あなたはどちらで進めますか?
🛠️ 作ってほしい人へ — あなたのフォームに合わせてLINE通知を実装します。ココナラで相談する(Googleフォーム自動化の専門サービス)
📦 自分で作りたい人へ — コピペで動くGAS自動化テンプレ集をnoteにまとめています。GAS自動化テンプレ集を見る
最後まで読んでいただきありがとうございました。


コメント