前回のおさらい
前回はメールの本文から正規表現とmatchメソッドを使って税抜請求額と税込請求額を取り出しました。
税抜請求額と税込請求額は両方とも文字列として変数に格納したのでいつでも利用可能です。
税抜請求額と税込請求額が書かれた行を検索する正規表現を書きました。
- /税抜請求額.*$/m
- /税込請求額.*$/m
正規表現を利用してmatch関数で税抜請求額と税込請求額が書かれた行を取得しました。
const taxNotIncluded = messageBody.match(/税抜請求額.*$/m)
const taxIncluded = messageBody.match(/税込請求額.*$/m)
メール本文中に書かれた文字列の取得はできましたので、今回は添付ファイルを取得してGoogleドライブに保存します。
添付ファイルを取得する
請求書メールには請求書ファイルが添付されています。

1個の請求書ファイルが添付されていますね。
添付ファイルを取得するにはメッセージオブジェクトのgetAttachmentsメソッドを使います。
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()
console.log(attachment)
}
実行結果

請求書メールに添付されているのは1つの請求書ファイルです。配列の中に一つしかオブジェクトがありませんので、どうやらこれが請求書ファイルっぽいですね。
では、本当に請求書ファイルなのかファイル名を確かめてみましょう。お目当てのオブジェクトは配列の1番目です。
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()
console.log(attachments[0].getName()) // 配列の1番目のオブジェクトのgetNameメソッドでファイル名を取得
}
実行結果

おー、なんかうまくいってるっぽいですね!
Googleドライブに保存する
さて、お次はGoogleドライブに保存します。Google Apps Scriptに色々書くまえにGoogleドライブの画面で保存先をつくっておくと整理されていいですね。
Googleドライブにフォルダを作成する
Googleドライブのマイドライブで右クリック > 新しいフォルダ

フォルダ名を「請求書」にする

「請求書」フォルダの中身

まだ何もありません。つくったフォルダに請求書ファイルを保存していきます。
Googleドライブに保存する
Googleドライブを操作するにはDriveAppクラスを利用してdriveオブジェクトを作ります。
このへんはGmailを利用するときと同じですね。
const drive = DriveApp
次に保存先のフォルダを指定します。フォルダを指定するにはフォルダIDが必要です。

フォルダをひらいたときのURLからフォルダIDをゲットできます。
「https://drive.google.com/drive/folders/フォルダID/」
で、フォルダオブジェクトを取得します。
const folder = drive.getFolderById('フォルダIDが入ります')
フォルダオブジェクトはフォルダ内にファイルをつくるためのcreateFileメソッドを持っています。
こいつを利用して請求書ファイルを請求書フォルダに保存しましょう。
const invoiceFile = folder.createFile(attachments[0])

blobなんてはじめて聞いたぜ!
blogの間違いじゃねぇのか!訴えてやる!
まぁまぁ、落ち着いてください。blobというのはPDFやテキストファイル、画像のようなファイルをオブジェクトとしてあつかえるようにしたものです。Google Apps Scriptではblobを操作するための専用のメソッドが用意されています。
参照)Google Apps Scriptのマニュアル blobクラス
さて、今はコードの全体がこのようになってまして、
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)
}
実行結果はというと、、、

このように無事にファイルオブジェクトをつくれました。
肝心のGoogleドライブにも請求書ファイルが保存されていますね。

なかなかいい感じです。
次回はチャットツールに通知するメッセージをつくります。
だいたいのチャットツールはメッセージを整形していい感じに作れるのですが、ツールによって整形ルールが違います。
効率化のために整形ルールの違いをものともしないプレーンな味わいのメッセージをつくろうと思います。それならどのチャットツールでも使えますからね。
敵は我なり届け雷
