前回のおさらい
前回は請求書メールの添付ファイルを取り出してGoogleドライブに保存しました。
Googleドライブにファイルを保存するとともにファイルオブジェクトも取得しましたのでファイル情報を取り出すことも可能です。
請求書メールから添付ファイルを取り出しました。
const attachments = message.getAttachments()
Googleドライブオブジェクトをつくりました。
const drive = DriveApp
さらにGoogleドライブオブジェクトからフォルダオブジェクトを取得しました。
const folder = drive.getFolderById('フォルダIDが入る')
最後に取得した請求書ファイルをGoogleドライブに保存してファイルオブジェクトをつくりました。
const invoiceFile = folder.createFile(attachments[0])
コード全体としてはこのようになっています。
const searchGmail = () => {
const gmail = GmailApp
const searchedMail = gmail.search('from:株式会社 インボイス送信元 subject: 【請求書】送付のご案内 is:unread')
const messages = searchedMail.map(thread => {
return thread.getMessages()
})
const message = messages[0][0]
// 本文から税抜請求額と税込請求額を取得
const messageBody = message.getPlainBody()
const taxNotIncluded = messageBody.match(/税抜請求額.*$/m)[0]
const taxIncluded = messageBody.match(/税込請求額.*$/m)[0]
// 添付ファイルの取得とドライブへの保存
const attachments = message.getAttachments()
const drive = DriveApp
const folder = drive.getFolderById('フォルダIDが入る')
const invoiceFile = folder.createFile(attachments[0])
console.log(invoiceFile)
}
今回はチャットツールに通知するためのメッセージをつくります。
レッツラゴー
通知用のメッセージを考える
通知先は自分と経理です。
伝えなければいけないのは以下の3つです。
- 請求額
- 請求書のURL
- 請求書の会社名
ざっくりひな型をつくります。
株式会社 インボイス送信元の請求書が届きました。
税抜請求額 *****円 税込請求額 *****円
以下のURLからダウンロードしてください。
https://ダウンロードURL
とまあこんな感じですかね。下線部分はGoogle Apps Scriptのプログラムから取得します。
では材料を集めていきましょう。
通知用メッセージに必要な材料を揃える
通知用メッセージの定義ができたら必要な材料をかき集めていきます。
請求書送信者の会社名
会社名はメールの送信元ですので、メッセージオブジェクトから取得します。
const fromName = message.getFrom()
console.log(fromName)
実行結果

これでもいいですが、必要なのは””の中の「株式会社 インボイス送信元」という文字列だけなんですよね。後ろのメールアドレスは不要です。
こういうときはmatchメソッドと正規表現を使って””の中の文字列だけ取得しちゃいます。
const companyName = fromName.match(/"([^"]*)"/)[1]
console.log(companyName)
正規表現の/”([^”]*)”/の意味
- “”の中
- “は除く
- すべての文字列
となりまして、実行結果はこのようになります。これで材料を一つゲット。

請求書のURL(GoogleドライブのURL)
請求書ファイルのURLはGoogleドライブのファイルオブジェクトの中にあります。
GoogleドライブのURL、もしくはダウンロード用のURLのいずれかを取得できるのですが、すぐにダウンロードすることを考えるとダウンロード用のURLがいいかもしれないですね。
const invoiceUrl = invoiceFile.getDownloadUrl()
console.log(invoiceUrl)
実行結果

ちゃんと出てきてます。オッケーオッケー。
最後の税抜請求額、税込請求額はすでに取得できてます。
というわけでメッセージをつくっちゃいましょう!
テンプレートリテラルを使って通知用メッセージをつくる
いまいちど通知用メッセージを確認してみましょう。
株式会社 インボイス送信元の請求書が届きました。
税抜請求額 *****円 税込請求額 *****円
以下のURLからダウンロードしてください。
https://ダウンロードURL
通常の文言に、変数に格納された文字列が入り混じってますよね。
そんなときはテンプレートリテラルを使います。なんか難しそうな言葉ですが、やってることは簡単。実際に書いてみます。
const chatMessage =
`${companyName}の請求書が届きました。\n${taxNotIncluded} ${taxIncluded}\n以下のURLからダウンロードしてください。\n${invoiceUrl}`
テンプレートリテラルを使うと通常の文字列の中に変数等を埋め込むことができます。
上のコードでは${companyName}といったように使っています。(companyNameは変数名)
注意点は文字列を“(バッククォート)で囲む点です。これ、”(シングルクォーテーション)じゃないんですよ。

おいおいおい、ウォーリーを探せよりわかりにくくねぇか!?
そう、初見では超分かりにくいっす。そして普通の事務作業をしている人は“(バッククォート)なんか使いませんのでキーボードのどこにあるかわかりません。初見殺し。
大丈夫、Shift + @で出ます。
実行結果

おー、これでメッセージまでつくれました。超順調です。
ここまでのコード全体はこのようになっています。
const searchGmail = () => {
const gmail = GmailApp
const searchedMail = gmail.search('from:株式会社 インボイス送信元 subject: 【請求書】送付のご案内 is:unread')
const messages = searchedMail.map(thread => {
return thread.getMessages()
})
const message = messages[0][0]
// 本文から税抜請求額と税込請求額を取得
const messageBody = message.getPlainBody()
const taxNotIncluded = messageBody.match(/税抜請求額.*$/m)[0]
const taxIncluded = messageBody.match(/税込請求額.*$/m)[0]
// 添付ファイルの取得とドライブへの保存
const attachments = message.getAttachments()
const drive = DriveApp
const folder = drive.getFolderById('フォルダIDが入ります')
const invoiceFile = folder.createFile(attachments[0])
// チャット通知用のメッセージをつくる
const fromName = message.getFrom()
const companyName = fromName.match(/"([^"]*)"/)[1]
const invoiceUrl = invoiceFile.getDownloadUrl()
const chatMessage = `${companyName}の請求書が届きました。\n${taxNotIncluded} ${taxIncluded}\n以下のURLからダウンロードしてください。\n${invoiceUrl}`
console.log(chatMessage)
}
何ごとも確認は必要です
多分いいと思うのですが、念のため経理にこれでいいか確認してみましょう。

待て待て、何月の請求書かメッセージに入れてほしいぞ!
OUCH!確かに請求月が入ってたほうがいいですよね。
次回は請求月をメッセージに追加します。ちなみに請求月は請求書PDFに記載があります。メールには記載がありません。
つまり、PDFをOCRして読み取ったテキストから請求月を取得します。
バサラ
