自動化
PR

LINEで特定グループのメンションをスプレッドシートに自動記録する方法

sanane
記事内に商品プロモーションを含む場合があります

はじめに

LINEを業務チャットの一部として活用する際、複数グループから特定のメンションだけを抜き出し、あとで振り返りや集計を行いたい場面があります。

本記事では、Google Apps Script(GAS)を用いて、LINEの指定したグループ内でBot宛に飛んできたメンションだけを自動でスプレッドシートに記録する仕組みを構築する方法をご紹介します。

手順をひとつずつ丁寧に解説していきますので、ぜひ最後までお付き合いください。

スクリプト概要

全体の流れ

今回の仕組みを実現するために、いくつか情報が必要になります。

  1. チャネルアクセストークンの取得
    • 今回はLINE Messaging APIを利用するため、利用にあたって「チャネルアクセストークン」の発行が必要になります。
  2. ユーザIDの取得
    • 誰に対してのメンションを記録するか判断するために、ユーザIDの取得が必要になります。
  3. グループIDの取得
    • どのグループに対するメンションを記録するか判断するために、該当グループのGroupIDの取得が必要になります。

利用手順

ステップ1:LINE公式アカウントの設定(Messaging APIの準備)

LINE公式アカウントの作成
  1. LINE Official Account Managerにアクセスして自身のアカウントでログインします。個人の利用であれば「LINEアカウントでログイン」で問題ありません。
  2. 「アカウントタブ」より「作成」をクリックし新規アカウントを作成します。
    • アカウント名:お好み(例:「通知アカウント」など)
    • メールアドレス:任意
    • 業種:個人
    • 運用目的:その他
    • 主な使い方:メッセージ配信用
  3. 各種同意画面に従い、「同意」を選択。
  4. 作成完了後、LINE公式アカウントが使用可能になります。
LINE公式アカウントでMessaging APIを有効にする
  1. LINE Official Account Managerで作成したアカウントにログインします。
  2. 画面右上の「設定」をクリック。
  3. 左メニューの「Messaging API」を選択。
  4. Messaging APIを利用する」をクリック
  5. プロバイダーを選択 → 「同意する」。
  6. プライバシーポリシー、利用規約は空欄のまま「OK」をクリック。
  7. 「OK」をクリックし、[Channel ID]と[Channel Secret]が表示されていることを確認します。
LINE Developersでのアクセストークン取得
  1. LINE Developersにアクセスし、「コンソールにログイン」をクリック。前ステップで選択したプロバイダーを選択します。
  2. 前ステップで作成したアカウントを選択します。
  3. 上部バーから「Messaging API設定」をクリック。
  4. ページ下部の「チャネルアクセストークン」を発行してコピーします。(後で使用します)。

ステップ2:Google Apps Scriptで通知スクリプトを作成する

SANANE
SANANE

今回はスプレッドシートと紐づく形でGASを作成していますが、Apps Script単体で作成しても問題ありません。

スクリプトの準備
  1. Googleスプレッドシートを開き、新規でスプレッドシートを作成します。
  2. 上部メニュー「拡張機能」 → 「Apps Script」をクリック。新しいタブでGoogle Apps Scriptのエディタが開きます。
スクリプトの編集
  1. もともと記載してあるmyfunctions{}は削除し、以下のコードをコピー&ペーストしてください。
  2. コード2行目のconst ACCESS_TOKEN = 'YOUR_ACCESS_TOKEN';YOUR_ACCESS_TOKEN 部分を、
    前ステップの最後でコピーしたチャネルアクセストークンに置き換えます。
    (シングルクォーテーション ' ' はそのままです)
  3. 上部メニューの「保存」ボタンをクリックして、プロジェクトを保存します。
// === 設定ここから ===
const ACCESS_TOKEN = '<発行したChannel Access Tokenを貼り付け>';
const BOT_USER_ID  = '<BotのUser IDを貼り付け>';
const TARGET_GROUP_IDS = ['<監視したいGroup_IDをカンマ区切りで列挙>'];  
// === 設定ここまで ===

function doPost(e) {
  let payload;
  try {
    payload = JSON.parse(e.postData.contents);
  } catch (err) {
    return ContentService.createTextOutput('OK');
  }
  if (!payload.events || payload.events.length === 0) {
    return ContentService.createTextOutput('OK');
  }

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet();

  payload.events.forEach(event => {
    const src        = event.source;
    const replyToken = event.replyToken;
    const msg        = event.message;
    const text       = msg && msg.type === 'text' ? msg.text.trim() : '';

    // ── グループ内処理 ──
    if (src.type === 'group' && msg && msg.type === 'text') {
      // (1) 「group id」コマンドは常に先に処理
      if (/group id/i.test(text) && replyToken) {
        replyText(replyToken, `あなたのGroup_IDは${src.groupId}です。`);
        return;  // このイベント処理を終了して次へ
      }

      // (2) Bot宛メンションは、TARGET_GROUP_IDS に含まれる場合のみ記録
      if (TARGET_GROUP_IDS.includes(src.groupId) &&
          msg.mention &&
          Array.isArray(msg.mention.mentionees) &&
          msg.mention.mentionees.some(m => m.userId === BOT_USER_ID)) {
        sheet.appendRow([ new Date(), src.groupId, src.userId, text ]);
      }
    }

    // ── 1:1トーク処理 ──
    else if (src.type === 'user' && msg && msg.type === 'text' && replyToken) {
      if (/my id/i.test(text)) {
        replyText(replyToken, `あなたのUser_IDは${src.userId}です。`);
      }
    }
  });

  return ContentService.createTextOutput('OK');
}

/**
 * replyToken を使ってメッセージを返信
 */
function replyText(replyToken, text) {
  const payload = {
    replyToken: replyToken,
    messages: [{ type: 'text', text: text }]
  };
  UrlFetchApp.fetch('https://api.line.me/v2/bot/message/reply', {
    method:      'post',
    contentType: 'application/json',
    headers:     { Authorization: 'Bearer ' + ACCESS_TOKEN },
    payload:     JSON.stringify(payload)
  });
}

ステップ3:グループID取得用ウェブアプリの作成

GASのデプロイ
  1. 右上[デプロイ]>[新しいデプロイ]を選択します。
  2. 表示される画面上で、歯車マークをクリックし、[ウェブアプリ]を選択します。
  3. [アクセスできるユーザー]を全員に変更し、[デプロイ]をクリックします。
  4. [アクセスを承認]をクリックします。
アクセス権の承認
  1. ログインしているGoogleアカウントをクリックします。
  2. [Advanced]をクリックします。
  3. [Go to 無題のプロジェクト(unsafe)]をクリックします。
  4. [Allow]をクリックします。
Webアプリ用URLをコピー

表示されるWebhook用の[WebアプリURL]をコピーしてください。

ステップ4:公式アカウントのグループ追加の許可設定

LINE Developersの操作
  1. LINE Developersに移動し[コンソールにログイン]をクリックします。
  2. 作成した公式アカウントをクリックします。
  3. 上部バーより「Messaging API設定」をクリックします。
LINE公式アカウントのグループ追加許可設定
  1. [LINE公式アカウント機能]>[グループトーク・複数人トークへの参加を許可する ]の[編集]をクリックします。
  2. 別タブが開き、[グループ・複数人トークへの参加を許可する]を選択します。タブは閉じても問題ありません。
Webhook URLの入力
  1. [Webhook設定]まで移動し、[編集]をクリックします。
  2. 前項でGASでコピーしたWebhook用のURL(WebアプリURL)を貼り付け、[更新]をクリックします。
応答メッセージの編集
  1. [LINE公式アカウント機能]>[応答メッセージ]の[編集]をクリックします。
  2. 別タブが開きます。[Webhook]をオン、[応答メッセージ]は必要に応じオフにしておきます。タブは閉じても問題ありません。

ステップ5:ユーザIDの取得

公式アカウントとのトークを開始

LINEを開き、作成した公式アカウントとの1:1トークルームに移動します。

ユーザIDの取得

トークルーム内にて[my id]とメッセージを送信してください。

正常に動作すると、ユーザIDが返されますのでコピーしてください。

ユーザIDの入力

取得したユーザIDはGASスクリプトのBOT_USER_IDの部分に入力し保存してください。

ステップ6:公式アカウントのグループ追加・グループIDの取得

LINE公式アカウントのグループへの招待

LINEを開き、任意のグループに作成した公式アカウントを招待します。

グループIDの取得

グループに対し、[group id]とメッセージを送信します。送信するとグループIDが返信されます。

グループIDの入力

取得したグループIDはGASスクリプトのTARGET_GROUP_IDSの部分に入力し保存してください。

複数のグループを対象とすることも可能です。その際は、カンマでグループIDを区切ってください。

ステップ7:新しいバージョンでのGASデプロイ

LINE公式アカウントのグループへの招待

ステップ3を参考に、IDを追加した更新版でGASの再デプロイを行います。

  1. GASエディタより、[デプロイ]>[新しいデプロイ]をクリックします。
  2. モーダルが表示されるため、[デプロイ]をクリックします。
  3. 表示される[Webアプリ]URLをコピーします。
グループIDの取得

ステップ4を参考に、発行された[Webアプリ]URLを再登録します。

  1. LINE Developersに移動し[コンソールにログイン]をクリックします。
  2. 作成した公式アカウントをクリックします。
  3. 上部バーより「Messaging API設定」をクリックします。
  4. [Webhook設定]まで移動し、[編集]をクリックします。
  5. 前項でGASでコピーしたWebhook用のURL(WebアプリURL)を貼り付け、[更新]をクリックします。
動作の確認

上記で設定は完了です。

あとはメンションがあると自動的メンション内容がスプレッドシートに記載されます。

SANANE
SANANE

スプレッドシートには[投稿日時][投稿されたグループID][投稿したユーザ][メンション内容]が記録されます。

注意点

  • 全員に対するメンションは記載されません。
  • 修正があった場合は都度GASをデプロイし直す必要があります。

まとめ

本記事では、LINEグループへのメンションを特定グループに絞り、Bot宛の会話だけをスプレッドシートに自動記録する方法を解説しました。

記事URLをコピーしました