Google Apps ScriptでGmailをLINEに通知する方法

特定のGmailをLINEに通知

Gmailを使用していると特定のメールのみLINEに通知したいことがある。

例えば会社のメールだけ条件を付けてLINEに通知するなどだ。

この記事ではGoogle Apps Scriptで簡単にGmailをLINEに通知する方法について説明します。

コードがわからない方でもほとんどコピペだけでできるようにしてあります。

LINE Notifyのトークンを発行

まずパソコンでLINE Notifyにログインします。

ログインできない場合はLINEアプリの設定 => アカウント => ログイン許可 が有効になっていません。

https://notify-bot.line.me/ja/

ログインしたらパソコンでLINE Notifyのマイページにアクセスして、アクセストークンの発行(開発者向け)の「トークンを発行する」を押します。

※ スマートフォンからではアクセストークンを発行できません。

LINE Notifyのマイページにアクセスして、アクセストークンの発行

https://notify-bot.line.me/my/

「トークンを発行する」を押すとモーダルが表示されるので、トークン名を「Gmail to LINE」と入力して、「1:1でLINE Notifyから通知を受け取る」を選択したあと「発行する」を押す。

発行するとトークンが表示されるのでコピーしておく。

発行したトークン

Google App Scriptのコードを作成

次にGmailをLINEに通知させるためにGoogle Apps Scriptのコードを作成します。

まず以下のURLにアクセスしてApps Scriptを新規作成します。

新規作成だと「無題のプロジェクト」なっているので「Gmail to LINE」のようなわかりやすい名前にすると良いでしょう。

https://script.google.com/home/projects/create

作成するコードは以下の通り。

const lineToken = '<LINE Notifyのトークン>'
const searchOperators = '<Gmail検索演算子付き条件>'

const sendLine = (body, lineToken) => {
  UrlFetchApp.fetch('https://notify-api.line.me/api/notify', {
    'method' : 'post',
    'payload': {'message': body},
    'headers': {'Authorization': `Bearer ${lineToken}`},
  })
}

const setSearchCondition = () => {
  const intervalMinute = 3
  const term = Math.trunc(Date.now() / 1000) - (intervalMinute * 60)
  return `(is:unread after:${term} ${searchOperators})`
}

const searchMail = (searchCondition) => {
  return GmailApp.search(searchCondition)
}

const getMessages = (searchResult) => {
  const mails = GmailApp.getMessagesForThreads(searchResult)
  const detailMessages = []
  const formatter = new Intl.DateTimeFormat('ja-JP', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
  })
  for (const messages of mails) {
    const message = messages.pop()
    detailMessages.push(`
      【日付】: ${formatter.format(message.getDate())}
      【From】: ${message.getFrom()}
      【件名】: ${message.getSubject()}
      【本文】: ${message.getPlainBody().slice(0, 200)}
    `.replace(/^ +/gm, ''))
  }
  GmailApp.markThreadsRead(searchResult)
  return detailMessages
}

const gmailToLine = () => {
  const result = searchMail(setSearchCondition())
  if (result.length) {
    const messages = getMessages(result)
    messages.forEach(message => sendLine(message, lineToken))
  }
}

lineTokenとsearchOperatorsという定数が1, 2行目にあり、ここに入力するだけで使えるようになっている。

lineTokenには先程発行したアクセストークンを貼り付ける。

searchOperatorsにはGmailをLINEに通知させる条件を入れる。

例えばsearchOperatorsに「from:example@gmail.com」を入れると、このメールアドレスのみがLINEに通知される。メールアドレスに名前の情報が含まれているなら「from:山田太郎」のように名前を直接入力も可能です。

検索演算子はfrom:以外にlabel:で特定のラベルのみLINEに通知したり、subject:で特定の件名だけLINEに通知することもできます。

詳しくはGmailで使用できる検索演算子をご参照ください。

試しにlineTokenとsearchOperatorsを入れた状態でgmailToLineを実行すると、今から過去3分以内に未読のGmailがある場合はLINEに通知される。※

過去3分以内に未読のGmailがある場合はLINEに通知される

※ 今から過去3分以内にしないと大量の未読メールをLINEに通知してしまう可能性があるため、このような条件をデフォルトで付けている。トリガーが1分なのにintervalMinuteが3になっているのはトリガーがエラーで失敗したときのために時間に余裕を持たせている。

トリガーを設定する

LINEに通知するのに手動でgmailToLineを実行するのは手間なのでトリガーで1分おきに実行して未読のメールがあったら自動でLINEに通知されるようにすると良いだろう。

やり方はエディタ左サイドバーにあるトリガーからページ右下にある「トリガーを追加」を選択してgmailToLineを1分おきに設定して保存するだけだ。

以上の手順だけでGmailを受信したらLINEに通知できるようになる。