GmailのメッセージをDiscordへ転送する

スプレッドシートで利用できるスクリプト Google Apps Script の Gmail Service を使ってGmailからメールを取得できるらしいので、DiscordのWebhookでチャンネルにメッセージを送信してみようと思います

ざっくりと4つの設定を行っていきます

- スプレッドシートを作成する
- WebhookのURLを取得する
- スクリプトを登録する
- 定期実行のトリガーを設定する

慣れない操作だとは思いますが、コピペとマウスでできるので是非やってみてください

スプレッドシートを作成する

スクリプトを登録するスプレッドシートを作成しておきます
スプレッドシートが一連の設定の中心にあるのですが、スプレッドシート自体に行う設定はほとんど無いです

WebhookのURLを取得する

Discordチャンネルでメッセージを受信するURLを取得します
チャンネルの設定から連携サービスのメニューを選択しウェブフックを作成します

チャンネルの編集はメニューのなかのアイコンから開きます

スクリーンショット 2020-09-22 8.07.32

スクリーンショット 2020-09-22 7.56.06

ウェブフックを作成をクリック、ウェブフックURLをコピーします

スクリーンショット 2020-09-22 7.58.31

スプレッドシートのA1セルへURLを貼り付けます

スクリーンショット 2020-09-22 8.01.28

スクリプトを登録する

スプレッドシートに転送スクリプトを登録します

スプレッドシートのツールメニューからスクリプトエディタを開きます

スクリーンショット 2020-09-22 8.49.00

スクリーンショット 2020-09-22 8.10.25

次のスクリプトをエディタに貼り付けて保存します
プロジェクト名はとりあえず「Gmail2Discord」にしました

function hook() {
 const threads = GmailApp.search('label:unread');  // 未読のスレッドを取得

 if (threads.length == 0) {
   Logger.log('新規メッセージなし');
   return
 }

 threads.forEach(function (thread) {
   const messages = thread.getMessages();

   const payloads = messages.map(function (message) {
     message.markRead();  // メールを既読に設定する

     const from = message.getFrom();
     const subject = message.getSubject();
     const plainBody = message.getPlainBody();

     const webhook = getWebhookUrl();

     Logger.log(subject);
     const payload = {
       content: subject,
       embeds: [{
         title: subject,
         author: {
           name: from,
         },
         description: plainBody.substr(0, 2048),
       }],
     }
     return {
       url: webhook,
       contentType: 'application/json',
       payload: JSON.stringify(payload),
     }
   })

   Logger.log(payloads);
   UrlFetchApp.fetchAll(payloads);
 })
}


function getWebhookUrl() {
 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 const sheet = spreadsheet.getActiveSheet();

 return sheet.getRange(1, 1).getValue();  // セルA1を取得
}

スクリーンショット 2020-09-22 8.13.31

関数を選択のメニューからhookを選択します

スクリーンショット 2020-09-22 8.17.34

三角のアイコンをクリックして一度実行します

スクリーンショット 2020-09-22 8.20.48

実行許可の確認ウィンドウが出てくるので、許可を確認を選択

スクリーンショット 2020-09-22 8.21.27

アカウントの選択詳細Gmail2Discord (安全ではないページ) に移動許可

スクリーンショット 2020-09-22 8.22.08

スクリーンショット 2020-09-22 8.22.24

未読のメールがあれば次のようなメッセージがチャンネルに届きます
メッセージの転送ができたら、定期実行の設定をします

スクリーンショット 2020-09-22 8.33.04

定期実行のトリガーを設定する

時計のアイコンから定期実行のトリガーを設定します

スクリーンショット 2020-09-22 8.38.59

右下のトリガーを追加ボタンをクリック

スクリーンショット 2020-09-22 8.42.25

イベントのソースを時間主導型、トリガーのタイプを分ベースのタイマーに設定します
設定が次のとおりになっていたら保存します

スクリーンショット 2020-09-22 8.44.24

ここまで設定がうまくいっていれば新着のメールがDiscordチャンネルに転送されてくるはずです

...

スレッドを取得している次のコードではGmailの検索で未読ラベルの検索をしているだけなので、検索条件を変えることでラベル指定での取得なども可能です

const threads = GmailApp.search('label:unread');  // 未読のスレッドを取得

僕の実際の運用では、スプレッドシートに複数のチャンネルのWebhookを登録してラベルや転送元などの条件で振り分けて使ってます
未読メールの通知だけでも便利ですが、用途次第で様々改良の余地はありそうです

共有サーバのチャンネルに個人のメールを転送しないようくれぐれも気をつけてくださいね

Gmail Service
https://developers.google.com/apps-script/reference/gmail


この記事が気に入ったらサポートをしてみませんか?