はじめに
すでに今更感があるのですが、最近Google Apps Script(GAS)とLINE Messaging APIを連携させたアプリケーションを作る機会があったので、その方法をまとめておきます。
釈迦に説法かもしれませんが、GASとLINE Messaging APIを連携させると、Googleが提供する各種サービスのデータをLINEで自動的に通知することができます。
この方法を用いると、たとえば次のようなことが可能になる、とのことです。
- 自分の作成したGoogleフォームがデータを受信したときにリアルタイムでLINE通知
- Googleカレンダーに登録した翌日の予定を時間指定でLINE通知
LINE Messaging APIは高機能なので、本来は双方向な送受信ができるようなのですが、とある事情で今回はGAS側からLINE側への一方向のメッセージ送信のみを実装することにしました。
手順
以下の手順は、すべてPCブラウザ上で実施するものとします。
1. LINE公式アカウントを作成し、Messaging APIを有効化
LINE Messaging APIは、LINE公式アカウントの機能を拡張するAPIです。したがって、その利用にはLINE公式アカウントの開設が必要です。LINE公式アカウントの開設後、LINE Messaging APIを有効化します(参考:[1])。
1-1. LINE公式アカウントを作成
まず、リンクからLINE公式アカウントの作成ページに入り、「LINE公式アカウントをはじめる」で開設ページを開きます。
Business IDの登録の際に個人のLINEアカウントもしくは、メールアドレスの登録が求められます。どちらでも作成できるはずですが、開発者が自分自身のユーザーIDを取得する際にLINEアカウントとビジネスIDの連携が必須となるようなので、特に事情の無い場合は個人のLINEアカウントで登録する方が良いかと思います(その他の項目も、メールアドレス登録は未検証です)。
その後、作成フォームに必要事項を入力して、LINE公式アカウントを作成します。
作成したLINE公式アカウントは、LINE Official Account Managerから確認できます。
1-2. LINE Messaging APIの有効化
LINE Official Account Managerの右上「設定」から「Messaging API」を選択し、「Messaging APIを利用する」をクリックします。
続いて、開発者情報の登録画面(初回のみ)とプロバイダーの登録・選択画面が表示されるので、適宜入力するとLINE Messaging APIが使える状態になります。
次に、開発者向け画面であるLINE Developersコンソールにログインします。先ほど選択したプロバイダー → 作製したLINE公式アカウントの順でクリックしていくと、LINE公式アカウントのチャネル基本設定画面が表示されると思います。
これで、チャネル(≒外部システム(本記事ではGAS)とLINEの機能を繋ぐ通信路)が開通したことを確認できました。
2. LINE Messaging APIの認証情報を取得
LINE Messaging APIを用いた自動送信を行うためには、チャネルアクセストークンと、メッセージの送信先に対応したID(ユーザーID、グループID、ルームIDのいずれか)の両方が必要になります。
さらにユーザーIDについては、それが開発者本人のものか、他人のものかによって、入手のしやすさが異なります。
状況を表に示すと、以下のようになります。
| 用途 | チャネルアクセストークン | ユーザーID | グループID | ルームID |
|---|---|---|---|---|
| 個人トーク | ○ | ○(開発者本人かどうかで入手のしやすさが変わる) | - | - |
| グループトーク | ○ | - | ○ | - |
| 複数人トーク | ○ | - | - | ○ |
まずは全部に共通するチャネルアクセストークンの入手方法を説明し、その後個別のIDの入手方法を説明します。
これから取得方法を紹介する認証情報はいずれも公開・漏洩することの無いよう、ご注意ください。
2-1. チャネルアクセストークンの取得
チャネルアクセストークンには4つの種類がありますが、ここでは「長期のチャネルアクセストークン」と呼ばれるものを使用することにします。
1-2節の最後で確認した、LINE公式アカウントのチャネル基本設定画面を開きます。
「Messaging API設定」タブを選択し、下部にある「チャネルアクセストークン(長期)」の「発行」をクリックするとチャネルアクセストークンを発行できます。
表示されたチャネルアクセストークン(長期)は後で使うので、コピーして一時的に保管しておきます。
2-2(a). 開発者が自分自身のユーザーIDを取得する
「LINE Developers コンソール」で、当該LINE公式アカウント「チャネル基本設定」タブの下部にある「あなたのユーザーID」から確認できます。
2-2(b). 開発者本人以外のユーザーID、グループID、ルームIDを取得する
開発者本人のユーザーID以外のIDを取得するためには、一時的にスクリプトを組む必要があります。今回は、GASを用いることにしました。
GASスクリプトの作成とデプロイ
まず、適当なGoogleスプレッドシートを作成し、上部「拡張機能」タブ内「Apps Script」からスクリプトエディタを開き、以下のスクリプトをコピー&ペーストします。
function doPost(e) {
// メッセージ送信先ID情報を入手し、スプレッドシートに記録するための一時的な関数
// IDを出力するスプレッドシート取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName('ids');
if (!sheet) {
sheet = ss.insertSheet('ids');
sheet.getRange(1, 1, 1, 4).setValues([['userId', 'groupId', 'roomId', 'timestamp']]);
}
const events = JSON.parse(e?.postData?.contents).events || [];
if (events.length === 0) {
return ContentService.createTextOutput('no events');
}
// イベントから送信元ユーザーのID(userId)、グループトークのグループID(groupID)、複数人トークのトークルームID(roomId)を抽出
events.forEach(ev => {
const userid = ev?.source?.userId;
const groupid = ev?.source?.groupId;
const roomid = ev?.source?.roomId;
const timestamp = new Date(ev?.timestamp);
sheet.appendRow([userid, groupid, roomid, timestamp]);
});
return ContentService.createTextOutput('ok');
}
次に、画面右上部「デプロイ」から「新しいデプロイ」を選択してダイアログを表示し、下記のように設定します。
- 「種類の選択」:「ウェブアプリ」
- 「次のユーザーとして実行」:「自分」
- 「アクセスできるユーザー」:「全員」
ダイアログ内「デプロイ」をクリックすると、アクセス許可を求められるので(初回のみ)確認のうえ続行するとデプロイされます。ウェブアプリのURLが発行されるので、コピーしておきます。
LINE Webhook設定
「Messaging API設定」タブを選択後、「Webhook URL」に先ほどコピーしたウェブアプリのURLをペーストし、「Webhookの利用」をONにします。
ここで「検証」を押すと「302 Found」のエラーメッセージが表示される場合もありますが、今回の用途としては問題ないと思います。
LINE公式アカウントのグループ・複数人トークへの参加許可
※こちらはグループ・複数人トークのIDを取得する場合のみ必須です。
LINE Official Account Managerに戻り、再び右上「設定」をクリックします。
「アカウント設定」タブを選択し、「トークへの参加」を「グループ・複数人トークへの参加を許可する」に変更しておきます(出典[3])。
IDの取得
LINE公式アカウントに対して、個人のLINEアカウントから「友達追加する」、「メッセージを送信する」などを行うと、そのアクションを行った個人アカウントのユーザーIDが'ids'シートに記録されます。
また、IDを取得したいグループ・複数人トークに対してLINE公式アカウントを追加したり、LINE公式アカウントが入っているグループ・複数人トークで個人アカウントから発言したりすると、対応するグループID・ルームIDが記録されます。
必要なIDを確認出来たら、デプロイを停止し、「Webhookの利用」をOFFにしておきます。
3. GASプロジェクトを作成
今回はテストということで、Googleフォームが投稿された際、LINEにメッセージを送信するスクリプトを記述してみました。
3-0. Googleフォームの準備
Googleフォームを作成し、左上部から「Apps Script」を選択して、GASエディタを開きます。
3-1. 認証情報をスクリプトプロパティに保管
ハードコーディングを避けるため、2節で取得した認証情報はスクリプトプロパティに保管することが望ましいとされています。
GAS画面左側「プロジェクトの設定」タブを選択し、「スクリプト プロパティを追加」から下表のように2件のスクリプトプロパティを入力・保存します。
| プロパティ | 値 |
|---|---|
| channelAccessToken | 2-1節で取得したチャネルアクセストークン(長期) |
| targetId | メッセージを送信したいユーザー/グループ/複数人トークのID (2-2節で取得) |
3-2. コードの実装
スクリプトエディタを開き、下記を貼り付けます。
function onSubmit(e) {
//フォーム投稿時、LINEにメッセージを送信するスクリプト
//LINEに送信する文章
let messageBody = 'フォームが投稿されました。';
sendLineMessage(messageBody);
}
function sendLineMessage(msg) {
//スクリプトプロパティで指定したID(ユーザーID/グループID/ルームID)に対してメッセージを送信
const url = "https://api.line.me/v2/bot/message/push";
const scriptProperties = PropertiesService.getScriptProperties();
const channelAccessToken = scriptProperties.getProperty('channelAccessToken');
const targetId = scriptProperties.getProperty('targetId');
const param = {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer " + channelAccessToken,
},
payload: JSON.stringify({
"to": targetId,
"messages": [{
"type": "text",
"text": msg
}]
})
};
try {
UrlFetchApp.fetch(url, param);
} catch (e) {
Logger.log('Error:')
Logger.log(e)
}
}
左側タブ「トリガー」を選択し、以下のように設定します。
- 「実行する関数を選択」:onSubmit
- 「実行するデプロイを選択」:Head
- 「イベントのソースを選択」:フォームから
- 「イベントの種類を選択」:フォーム送信時
ダイアログ内「保存」をクリックすると、アクセス許可を求められる(初回のみ)ので、確認のうえ続行するとトリガーが設定されます。
3-3. 動作確認
Googleフォームを送信すると、LINE公式アカウントから通知が来るようになることが確認できました。
今回の内容はGoogleフォームが送信された際に通知を受けるだけの簡単なものでしたが、onSubmit関数を工夫するとフォームから様々な内容をLINEに飛ばすことができると思います。
おわりに
GASとLINE Messaging APIを連携したアプリケーションを作成するのは初めてだったので、勉強しながら作成しました。
実機での動作は確認しておりますが、記載内容の正確性は保証できかねますので、リンク先の記事等も参照しつつご覧いただければと思います。
出典・参照
[1] Messaging APIを始めよう | LINE Developers
[2] Google Form × LINE Messaging API × GAS で、お問い合わせをLINEに自動通知する - Zenn
[3] 【GAS×LINE Messaging API】グループLINEへの平日定期リマインダーを実装してみた #JavaScript - Qiita
[4] Messaging APIリファレンス | LINE Developers