Google App Script 自動化

【GAS】Amazonの注文内容をカレンダーに登録

はじめに

なるちゃん

おとん、このスマホっていつAmazonで買ったんだっけ?

なんか、充電100%から減るのが早くて、1日もたないん。

3年前の4月だね。

そろそろ変え時かもね。

関谷さん
なるちゃん

じゃあ、このタブレットはいつ買ったっけ?

この前、学校で落としてガラス割っちゃったん。

今年の6月だね。

ガラスが割れたのは危ないね。

関谷さん
なるちゃん

この色鉛筆はいつ買ったっけ?

減るのが早いんだけど。

去年の3月だね。

たくさん絵を描いたんだね。消耗品だから仕方ないね。

関谷さん
なるちゃん

ねえ、なんでいつ買ったのか全部覚えてるん?

おとんは覚えてないよ。

Google先生にまかせているだけ。

関谷さん

Amazonの注文内容をカレンダー登録

購入日をすぐにわかるようにしておくと、無駄に購入し過ぎていることや、こわれる予測や、今後の購入計画に役立てられるかもしれませんね。

ここでは、Gmailで受信したAmazonからの注文確認メールを、Googleカレンダーに自動的に登録するGoogle App Scriptを紹介します。

処理概要

以下のような処理を実装することを考えます。

  • Amazonから注文確認メールを受信
  • 未処理のメールを抽出
  • カレンダー注文確認メールの内容を登録
  • 注文確認メールに処理済みラベルを付ける

そして、この処理を定期的に行わせます。

未処理メールの抽出

Amazonからの注文確認メールで、未処理のメールの抽出は以下の検索文字列で実現します。

メールの抽出条件の構文は、Gmailの抽出条件に設定できる構文と同じです。

// 処理済み後に付けるラベル名
var LABEL = '自動処理済';

// GMail検索文字列(Amazonからの注文確認メール)
var SEARCH_QUERY = 'is:unread -label:' + LABEL + ' from:digital-no-reply@amazon.co.jp subject:amazon.co.jp注文';

処理済みを識別するために、処理完了後に該当メールのラベルに「自動処理済」を付けます。

そのため、抽出条件は以下の4つとなります。

  • 未読であること(is:unread)
  • 「自動処理済」のラベルが付いていないこと(-label:自動処理済)
  • Amazonからのメール(from: digital-no-reply@amazon.co.jp)
  • 件名から注文確認メールが確認できること(subject:amazon.co.jp注文)

Gmailへのアクセス方法については以下の記事を参照ください。

カレンダー登録

カレンダーのタイトルは「Amazon注文」とします。※好みで変えてください。

カレンダーに登録する詳細内容に、Amazonからの注文確認メールの内容を登録します。

function registerCalendar(calendar, startTime, endTime, contents){
  if (startTime && endTime && contents) {
    var title = 'Amazon注文';

    // カレンダーに追加
    if(checkExist(calendar, startTime, endTime, title) == false){
      var options = {
        description : contents
      }
      var event = calendar.createEvent(title, startTime, endTime, options);
      event.setColor(CalendarApp.EventColor.GREEN);
      event.removeAllReminders();   // 利用実績なので通知しない
    }
  }  
}

登録済み情報チェック

カレンダーに追加する前に、同じ時間の同じタイトルで、既にカレンダーへの登録があるかチェックしています。

そして、同じイベントの登録がない場合に、カレンダーに登録します。

function checkExist(calendar, registStart, registEnd, registTitle){

  // イベントリスト取得
  var events = calendar.getEvents(registStart, registEnd);
  for(const event of events){
    var title = event.getTitle();
    if(title.indexOf(registTitle) >= 0){
      return true;    // イベント登録済み
    }
  }
  return false;  // イベント未登録
}

この関数では、カレンダーへの登録があるかをチェックし、以下のように値を返します。

  • イベント登録済み:true
  • イベント未登録:false

処理済みラベル

処理済みを識別する方法としては、既読にする方法もあるのですが、それだとメールをチェックした時に気づくことができず見落とす可能性が高くなるため、処理済みメールの識別には「自動処理済」のラベルを付けることにします。

この「自動処理済」のラベルについては、好みで変更することができます。

var LABEL = '自動処理済';

function putLabel(thread){
  var label = GmailApp.getUserLabelByName(LABEL);
  if(label){
    thread.addLabel(label);
    Logger.log('既存ラベル使用');
  }
  else{
    var newlabel = GmailApp.createLabel(LABEL);
    thread.addLabel(newlabel);
    Logger.log('新規ラベル追加');
  }
}

「自動処理済」のラベルがない場合は、新規にラベルを作る仕組みとしています。

実行結果

Googleカレンダーには以下のように登録されます。

イベントをクリックすることで、詳細内容を確認することができます。

全てのコード

/*
 * Amazonの注文内容をGoogle Calendarに登録する
 * 
 * Google Calenderに以下のフォーマットで終日イベントが作成される。
 * 「Amazon注文」
 * 
 * 2021/09/15 Created by N.Sekiya
 */

// 処理済み後に付けるラベル名(ラベルが存在しなければ自動的に作られる)
var LABEL = '自動処理済';

// GMail検索文字列(Amazonからの注文確認メール)※未読でラベルなしが条件
var SEARCH_QUERY = 'is:unread -label:' + LABEL + ' from:digital-no-reply@amazon.co.jp subject:amazon.co.jp注文';

// 検索文字列
var FORWARD_MSG = '---------- Forwarded message ---------';

function registOrderInformationToCalendar() {
  var calendar = CalendarApp.getDefaultCalendar();  // デフォルトカレンダーを取得
  var threads = GmailApp.search(SEARCH_QUERY, 0, 1);
  if (threads.length === 0) {
    Logger.log('メールが見つかりません');
    return;
  }

  for(var k in threads){
    var thread = threads[k]
    var messages = thread.getMessages();
    for (var j in messages){
      var message = messages[j];
      var body = message.getPlainBody();   // HtmlメールからPlain textの本文を取得する
      var startTime = message.getDate();
      var endTime = new Date(startTime.getTime() + 10 * 60000);
      //Logger.log("body=" + body);

      var contents = '';        // 登録内容
      var flgEnd = 0;           // 終了フラグ(0:続ける、1:処理しないで終了する)

      // 注文メールの内容確認
      var rows = body.split("\n");
      for (var i in rows) {
        var row = rows[i];
        if (row.indexOf(FORWARD_MSG) >= 0) {
          flgEnd = 1;
          break;
        } 
        contents = contents + row;
      }

      if(flgEnd){
        continue;
      }

      // Googleカレンダーに登録
      registerCalendar(calendar, startTime, endTime, contents);

      // 処理済みメールとしてラベルを付ける
      putLabel(thread);
    }
  }
}

/*
 * Google Calendarに登録
 */
function registerCalendar(calendar, startTime, endTime, contents){
  if (startTime && endTime && contents) {
    var title = 'Amazon注文';

    // カレンダーに追加
    if(checkExist(calendar, startTime, endTime, title) == false){
      var options = {
        description : contents
      }
      var event = calendar.createEvent(title, startTime, endTime, options);
      event.setColor(CalendarApp.EventColor.GREEN);
      event.removeAllReminders();   // 利用実績なので通知しない
    }
  }  
}

/*
 * 登録済み情報があるかチェック
 */
function checkExist(calendar, registStart, registEnd, registTitle){

  // イベントリスト取得
  var events = calendar.getEvents(registStart, registEnd);
  for(const event of events){
    var title = event.getTitle();
    if(title.indexOf(registTitle) >= 0){
      return true;    // イベント登録済み
    }
  }
  // イベント未登録
  return false;
}

/*
 * 処理済みとしてスレッドにラベルを付ける
 * LABELで指定されるラベルが存在しない場合は作成する
 */
function putLabel(thread){
  var label = GmailApp.getUserLabelByName(LABEL);
  if(label){
    thread.addLabel(label);
    Logger.log('既存ラベル使用');
  }
  else{
    var newlabel = GmailApp.createLabel(LABEL);
    thread.addLabel(newlabel);
    Logger.log('新規ラベル追加');
  }
}

繰返し実行

スクリプト単体で実行し、正しく動作することを確認したら、繰り返し実行することを考えます。

繰り返し実行には、トリガーの設定を行います。

以下の画面に示すように、スクリプトエディタの左側のメニューで「トリガー」を選択します。

右下の「トリガーを追加」ボタンを押すことで、新しいトリガーを追加できます。

ここで、以下のように設定します。

  • 実行する関数を選択:メイン関数であるregistOderInfomationToCalendarを選択
  • イベントのソースを選択:時間主導型
  • 時間ベースのトリガーのタイプを選択:分ベースのタイマー
  • 時間の間隔を選択(分):5分おき

時間の間隔は1分おきにもできますが、そんなに急ぐ必要はないので5分おきにしています。

最後に

Gmailで受信したAmazonからの注文確認メールの内容を解析し、Googleスプレッドシートに自動的に追加すると、購入リストを手動で作らなくて済むようになりますね。

せどりをやっている人には重宝するかもしれませんね。

では、今日も良い一日を。

-Google App Script, 自動化
-, , , , ,