システム 仕事効率化

【GAS】Gmailで受信した特定のメールをLINE WORKSに転送してみた

  1. HOME >
  2. システム >
  3. 仕事効率化 >

【GAS】Gmailで受信した特定のメールをLINE WORKSに転送してみた

これまでLINE転送には「LINE Notify」を利用しておりましたが、2025年3月末でサービス終了のお知らせが・・・

個人的にめっちゃ多用していたので衝撃でした。

では、Gmailで受信したメールをどこに通知しよう。と考えた際に「slack」「chatwork」「LINE WORKS」など様々なサービスを検討しましたが、結果LINE WORKSを選択しました。

今回は、私がLINE WORKSにて設定した内容を後の記録用として記事を書いていこうと思います。

前提:LINE WORKSには、APIを受け取るための情報を「アプリ」に登録し、実際にユーザー側に見えるBotを作成してアプリと紐づける

LINE WORKS Developer Consoleでの処理(管理者権限でのログイン)

LINE WORKS Developer Consoleを開き管理者権限にてログインします。

アプリの新規追加を押下し、アプリ名を入力する。

アプリ名の修正・アプリの説明を入力し、「OAuth Scopes」の「管理」を押下。

Gmialを通知するために利用する「bot」と「bot.read」にチェックを入れ保存する。

保存が完了すると「Gmail転送」アプリが作成されていることが確認できます。

Botを登録する

APIからBotを操作するための設定です。

サイドバーから「Bot」を選択肢、右側の登録を押下。

※すでに1つBotを作成して動かしているため表示されていますが、初めて作成する場合には何も表示はありません

Bot登録画面にて以下内容を入力します。

  • Bot名:Botの名前(Gmail通知Botなど)
  • 説明:Botの説明(hogehoge@gmail.comのメールを転送するためのBotなど説明を入力)
  • Botポリシー(トークルームへの招待):複数人のトークで利用したい場合にはチェック
  • 管理者:管理者の主担当に自分のユーザを登録する。※その他複数人で管理する場合には状況に応じて変更してください。

最後に「保存」を押下すると以下のポップアップが表示されるため「OK」を押下。

以上でBotの登録は完了です。

Bot一覧画面を表示

Bot一覧画面を表示してみましょう。

先程は1だったBotが2つになっていることが確認できます。

ステータスが「準備中」になっていますので、これから有効化の処理を行います。

LINE WORKS AdminにてBotを登録する

ユーザから実際に見えるBotをLINE WORKS Admin管理画面にて設定します。

管理画面から〔サービス〕>〔Bot〕と進み、右上の「Bot追加」を押下します。

Bot追加画面を見ると、先程DeveloperConsoleにて登録したBot情報が表示されているので、「追加」を押下し、追加する。

Bot一覧画面に戻ると、先程まで1つしか表示されていなかったBotが2つに代わっておりますので正常に追加されています。

再度Developer Consoleページへ

  • Bot ID
  • Client ID
  • Client Secret
  • Service Account
  • Private Key
  • チャネルID

上記の情報を取得します。

※GAS設定時に利用します。

Developer Consoleへ戻り、サイドメニューの「Bot」を押下すると、先程までステータス「準備中」であった項目が「サービス中」に変更されていることが確認できます。

作成したBotを開き詳細画面を確認します。

詳細画面内「Bot ID」は後ほど使用しますので、コピーできるようメモなどに貼り付けておきます。

続いてサイドバー「API」を押下し、作成したアプリ「Gmail転送」を押下し、詳細画面へ進みます。

詳細画面にて、「Client ID」および「Client Secret」の値を先程メモしておいたメモなどに貼り付け後ほど利用できる状態にしておきます。

次に「Service Account」の発行を押下します。

発行を押下すると「Service Accountを発行すると、管理者と同じ権限を持つアカウントが発行されます。発行しますか?」と注意がでてきますが、「OK」で次へ進みます。

「Service Account」が発行されますので、こちらも後ほど利用できるようメモなどにコピーしておきましょう。

「Service Account」が発行されると、「Private Key」という項目が表示されるので、「発行/再発行」を押下します。

こちらも発行時ポップアップができてきますが、内容を読み「OK」で次へ進みます。

「Private Key」は画面上に表示されるのではなく、keyファイルとしてダウンロードされますのでこちらも後ほど利用できるよう覚えることができる場所に保存しておきましょう。

LINE WORKS AdminでBotをトークグループに登録する

LINE WORKS Adminの元年へ戻り、Botをトークグループに登録します。

公開Botの場合にはBotを公開した状態で置いておいても問題ないですが、公開状態の場合はグループ以外のユーザもBotを登録するとメールの内容を見ることができるため、特定のグループのみに共有したい場合などは、一度公開にして特定のグループに追加し、再度非公開にし、見えなくする方がいいでしょう。

今回は、一度公開状態にしてグループに追加し、再度非公開に変更する方法で試してみたいと思います。

〔サービス〕>〔Bot〕>〔作成したBot〕

を押下しBot詳細を開きます。

作成したBot詳細の公開設定が「非公開」となっておりますので、「修正」を押下し「公開」へと変更します。

LINE WORKSのトークルームへと移動します。

※今回は、すでに作成しているグループに対してBotを追加していますが、新しくグループを作成する場合には、作成時にBotを同時追加することも可能です。

追加したいグループのトークルームを開き、右側にあるメニューを表示します。

「Bot招待」を押下し、先程作成したBotを選択して追加します。

これでトークルームにBotが入りました。

先程と同じトーク画面からメニューを開き「チャネルID」を押下しトークルーム固有のIDをコピーします。

こちらも後ほど利用しますので保存しておきます。

トークルームへのBotの追加が完了したため、現在「公開」にしているステータスを「非公開」に変更します。

再度LINE WORKS Adminより

〔サービス〕>〔Bot〕>〔作成したBot〕>〔修正〕

に進み非公開へと変更します。

これで非公開の設定が完了しました。

先程のトークルームの「Bot招待」一覧画面から表示されていないことが確認できます。

GAS設定

GASのプロジェクトファイルを作成する。

転送したいGmailのGoogleアカウントにてログインし、Googleドライブを開きます。

格納するフォルダを分けておく方がわかりやすいので、新しいフォルダを作成しGAS用のフォルダを作成します。

作成したフォルダにて、〔新規〕>〔その他〕>〔Google App Script〕を開きます。

赤枠部分が「無題のプロジェクト」となっているため、任意の名前に変更します。

Gmial×LINE WORKSなどなんでも構いません。

続いてスクリプトをコピーして「コード.gs」に貼り付けます。

※デフォルトで入っている、function ~の記述はすべて消去し貼り付けてください。

※functionが残ったまま貼り付けると正常に動作しません。

function postGmailToLineworks() {
  const BOT_ID = "xxxxxxx"; // あなたのBot ID
  const CHANNEL_ID = "xxxxxxxxx"; // チャンネルID
  const url = `https://www.worksapis.com/v1.0/bots/${BOT_ID}/channels/${CHANNEL_ID}/messages`;

  const config = {
    SCOPE: 'bot,bot.read',
    CLIENT_ID: 'xxxxxxxxxxxxxxxxxxx',
    CLIENT_SECRET: 'xxxxxxxxxxxxxx',
    SERVICE_ACCOUNT: 'xxxxxx.xxxxxxxxxxxxx@xxxxxx',
    PRIVATE_KEY: `-----BEGIN PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxx
-----END PRIVATE KEY-----`
  };

  const interval = 1; // 何分前からの新着メールを確認する?
  const f_body = 1; // 0:本文なし, 1:本文あり
  const maxBodyLength = 500; // 本文の最大文字数制限 500文字で設定
  const now_time = Math.floor(new Date().getTime() / 1000);
  const time_term = now_time - ((60 * interval) + 3);
  
  const labelName = "xxxxxxxxx";//転送したいラベル名を入力
  const searchQuery = `(label:${labelName} is:unread after:${time_term})`;
  const threads = GmailApp.search(searchQuery);

  if (threads.length === 0) {
    Logger.log("📭 新着メールなし");
    return;
  }

  const accessToken = getAccessToken(config).access_token;
  const myMessages = GmailApp.getMessagesForThreads(threads);

  for (let i in myMessages) {
    for (let j in myMessages[i]) {
      let strFrom = myMessages[i][j].getFrom();
      let strDate = Utilities.formatDate(myMessages[i][j].getDate(), "JST", "yyyy/MM/dd HH:mm:ss");
      let strSubject = myMessages[i][j].getSubject();
      let strMessage = f_body ? myMessages[i][j].getPlainBody().slice(0, 1000) : "";
        
      let fullMessage = `📩 *新着メール通知*\n👤 *差出人:* ${strFrom}\n📅 *受信日時:* ${strDate}\n📝 *件名:* ${strSubject}\n----------------------------\n${strMessage.replace(/\r?\n/g, "\n")}`;
        
      const options = {
        method: 'post',
        headers: {
          'Authorization': `Bearer ${accessToken}`,
          'Content-Type': 'application/json'
        },
        payload: JSON.stringify({
          'content': {
            'type': 'text',
            'text': fullMessage
          }
        })
      };
        
      UrlFetchApp.fetch(url, options);
    }
  }
}

function getAccessToken(config) {
  const time = Date.now();
  const header = Utilities.base64Encode(JSON.stringify({ 'alg': 'RS256', 'typ': 'JWT' }));
  const claimSet = Utilities.base64Encode(JSON.stringify({
    'iss': config.CLIENT_ID,
    'sub': config.SERVICE_ACCOUNT,
    'iat': Math.floor(time / 1000),
    'exp': Math.floor(time / 1000 + 3600)
  }));
  const signature = Utilities.base64Encode(Utilities.computeRsaSha256Signature(`${header}.${claimSet}`, config.PRIVATE_KEY));
  const jwt = `${header}.${claimSet}.${signature}`;

  const endpoint = 'https://auth.worksmobile.com/oauth2/v2.0/token';
  const options = {
    method: 'post',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    payload: {
      'assertion': jwt,
      'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer',
      'client_id': config.CLIENT_ID,
      'client_secret': config.CLIENT_SECRET,
      'scope': config.SCOPE
    }
  };
  return JSON.parse(UrlFetchApp.fetch(endpoint, options));
}

これでラベル分けされたメールをLINE WORKSに通知するためのGASの入力は完了です。

実際に内容を入力すると上画像のようになります。

コピーする際に「””」や「``」は消さずにIDを入力するようにしてください。

条件を変更したい場合などがあれば、こちらのコードをChatGPTに投げて修正してもらうと希望に近いコードになると思います。

続いて先程記述したコードが実際に動くかを確かめます。

データを保存するため画面上部の保存アイコンをクリックし、保存完了後に「デバッグ」を押下します。

初回デバッグ時、「承認が必要です」というポップアップが表示されると思いますが、許可を行います。

今回のGoogleアカウントを選択します。

画像では、「詳細を非表示」となっていますが、開くと「詳細を表示」と出ますので詳細を表示させ、「(安全ではないページ)に移動」を押下します。

遷移後のページにてアカウントへのアクセスする情報の選択画面が表示されますので、選択して「続行」

デバッグが実行された実行ログが表示されます。

スクリプトをデプロイする

画面上部の「デプロイ」を押下。

「新しいデプロイ」を選択。

種類の選択にて「ウェブアプリ」を選択肢、説明文やアクセスできる情報などを入力し「デプロイ」

デプロイを更新しました。という画面に遷移すれば「完了」を押下。

定期的に実行するためのトリガーを設定する

今回私が作成したGmailラベルのLINE WORKSへの通知の実行時間は最短の「1分」で定期的に実行するためのトリガーを設定しています。 そこまで頻繁に必要なければ必要に応じて時間を延ばしてください。

サイドバーの「トリガー」を選択肢、「+トリガーを追加」を押下。

  • 実行する関数を選択:postGmailToLineworks
  • 実行するデプロイを選択:Head
  • イベントのソースを選択:時間主導型
  • 時間ベースのトリガータイプを選択:分ベースのタイマー
  • 時間の間隔を選択(分):1分おき
  • エラー通知設定:毎日通知を受け取る

保存。

トリガーが保存されていればあとは、テストメールを送信し、実際にトークルームに通知されるかを確認すれば完了です。

さいごに

今回は、Gmailで受信した特定のメールをLINE WORKSへ転送(通知)する方法について紹介いたしました。

最近ではAIがプログラムの修正や作成をしてくれるのでとても便利になりましたね。

作成してくれたプログラムのまま動くこともあれば、多少の修正が必要になるケースもありますので過信しすぎないように注意は必要ですが、利用できるものは最大限に活用していきたいですね。

ではでは〜。

-システム, 仕事効率化