Google Apps Scriptでgmailからスプレッドシートに特定の文字列を自動で写せるようにしてみた
目的
読書記録のためにスプレッドシートにタイトルと著者名を手打ちしていたのを、gmailに図書館から届く予約の本が届いた旨のメールの本文からタイトルと著者名を抽出してスプレッドシートに自動で入力できるようにしたい。
図書館から届くメールの本文(抜粋)
予約された以下の資料の準備が整いました。
書名: 創造の狂気ウォルト・ディズニー
著者名: ニール・ゲイブラー/著
出版者: ダイヤモンド社
確保日: 2021/03/02
取置期限日は2021/03/09です。
書名: SHOE DOG
著者名: フィル・ナイト/著
出版者: 東洋経済新報社
確保日: 2021/03/02
取置期限日は2021/03/09です。
来館時にはマスク着用の上、30分程度の短時間のご利用をお願いします。
コード
function myFunction() { // メール検索 var threads = GmailApp .search('subject:予約資料確保のお知らせ -label:処理済み'); threads.forEach(function(thread) { var messages = thread.getMessages(); messages.forEach(function(message) { var plainBody = message.getPlainBody(); // 本文検索 var title = plainBody.match(/書名: (.*)/g); var name = plainBody.match(/著者名: (.*)/g); // シートの指定と行を上から書名の数だけ追加する var sheet = SpreadsheetApp .getActive() .getSheetByName('シート1') .insertRowsBefore(2, title.length); // 1通につき書名の数だけいらない部分を削除しながらループ for (i = 0 ; i < title.length ; i++) { sheet .getRange(2 + i, 1) .setValue(title[i].replace(/書名: /, '')); sheet .getRange(2 + i, 2) .setValue(name[i] .substring(0, name[i].indexOf("/")) .replace(/著者名: /, '') ); } }); // 処理済みのメールを次回検索時に除外するためのラベリング var label = GmailApp.getUserLabelByName('処理済み'); thread.addLabel(label); }); }
コードの解説
GmailApp.search()
gmail内での検索結果をスレッド単位で取得する。
つまり、[[A], [A,B], [C], [D]]みたいな二重配列の形で取得される。
初回時の確認
結果
自動化
おまけ(ツイッターに投稿するアイキャッチ画像の変更)
記事のアイキャッチ画像を変更してから再度ツイッターに記事を投稿しようとすると、アイキャッチ画像が変更前の画像のまま表示されてしまい四苦八苦。
解決策は下記URLからツイッターさんにアイキャッチ画像を変えましたと自己申請しないといけないとのこと。
cards-dev.twitter.com
ツイッターで一度記事を投稿するとそのときのアイキャッチ画像がツイッターのDBに保存されるので、記事のアイキャッチ画像を変えて再度ツイッターに投稿しようとしても変更後のアイキャッチ画像ではなく最初のアイキャッチ画像が表示されてしまう。https://t.co/HaMzEG1DQr
— 蟹江誠 (@KaneyHonest) March 6, 2021
感想
初めて自分の作りたいと思うものを作ると、それまでの飽き性が嘘のように長時間集中して取り組むことができた。
ヒットした記事のコードを改変するだけの作業なのに時間が恐ろしいほど溶けていった。