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]]みたいな二重配列の形で取得される。

初回時の確認


f:id:KaneyHonest:20210307092533p:plain
この画面が出てきたら、「権限を確認」を選択


f:id:KaneyHonest:20210307093422p:plain
スプレッドシートを編集しているアカウントを選択


f:id:KaneyHonest:20210307094135p:plain
左にある「詳細」を選択

f:id:KaneyHonest:20210307092804p:plain
スプレッドシートのプロジェクト名 +(安全でないページ)に移動」を選択


f:id:KaneyHonest:20210307094222p:plain
「許可」を選択


結果

f:id:KaneyHonest:20210307092055p:plain
新しいメール1通に対して


f:id:KaneyHonest:20210307092119p:plain
さらに新しいメール1通に対して


自動化

f:id:KaneyHonest:20210306155451p:plain
左側の一覧から「トリガー」を選択


f:id:KaneyHonest:20210306160058p:plain
右下の「トリガーを追加」から


f:id:KaneyHonest:20210306155604p:plain
イベントのソースの設定で自動化


おまけ(ツイッターに投稿するアイキャッチ画像の変更)

記事のアイキャッチ画像を変更してから再度ツイッターに記事を投稿しようとすると、アイキャッチ画像が変更前の画像のまま表示されてしまい四苦八苦。

解決策は下記URLからツイッターさんにアイキャッチ画像を変えましたと自己申請しないといけないとのこと。

cards-dev.twitter.com


感想

初めて自分の作りたいと思うものを作ると、それまでの飽き性が嘘のように長時間集中して取り組むことができた。
ヒットした記事のコードを改変するだけの作業なのに時間が恐ろしいほど溶けていった。


主要参考記事

developers.google.com

valmore.work

blog.8basetech.com

tonari-it.com

yaritakunai.hatenablog.com