GmailのメッセージをDiscordへ転送する
スプレッドシートで利用できるスクリプト Google Apps Script の Gmail Service を使ってGmailからメールを取得できるらしいので、DiscordのWebhookでチャンネルにメッセージを送信してみようと思います
ざっくりと4つの設定を行っていきます
- スプレッドシートを作成する
- WebhookのURLを取得する
- スクリプトを登録する
- 定期実行のトリガーを設定する
慣れない操作だとは思いますが、コピペとマウスでできるので是非やってみてください
スプレッドシートを作成する
スクリプトを登録するスプレッドシートを作成しておきます
スプレッドシートが一連の設定の中心にあるのですが、スプレッドシート自体に行う設定はほとんど無いです
WebhookのURLを取得する
Discordチャンネルでメッセージを受信するURLを取得します
チャンネルの設定から連携サービスのメニューを選択しウェブフックを作成します
チャンネルの編集はメニューのなかのアイコンから開きます
ウェブフックを作成をクリック、ウェブフックURLをコピーします
スプレッドシートのA1セルへURLを貼り付けます
スクリプトを登録する
スプレッドシートに転送スクリプトを登録します
スプレッドシートのツールメニューからスクリプトエディタを開きます
次のスクリプトをエディタに貼り付けて保存します
プロジェクト名はとりあえず「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を取得
}
関数を選択のメニューからhookを選択します
三角のアイコンをクリックして一度実行します
実行許可の確認ウィンドウが出てくるので、許可を確認を選択
アカウントの選択→詳細→Gmail2Discord (安全ではないページ) に移動→許可
未読のメールがあれば次のようなメッセージがチャンネルに届きます
メッセージの転送ができたら、定期実行の設定をします
定期実行のトリガーを設定する
時計のアイコンから定期実行のトリガーを設定します
右下のトリガーを追加ボタンをクリック
イベントのソースを時間主導型、トリガーのタイプを分ベースのタイマーに設定します
設定が次のとおりになっていたら保存します
ここまで設定がうまくいっていれば新着のメールがDiscordチャンネルに転送されてくるはずです
...
スレッドを取得している次のコードではGmailの検索で未読ラベルの検索をしているだけなので、検索条件を変えることでラベル指定での取得なども可能です
const threads = GmailApp.search('label:unread'); // 未読のスレッドを取得
僕の実際の運用では、スプレッドシートに複数のチャンネルのWebhookを登録してラベルや転送元などの条件で振り分けて使ってます
未読メールの通知だけでも便利ですが、用途次第で様々改良の余地はありそうです
共有サーバのチャンネルに個人のメールを転送しないようくれぐれも気をつけてくださいね
Gmail Service
https://developers.google.com/apps-script/reference/gmail