Google App Script 自動化

【GAS】注文リスト自動作成&Googleカレンダー自動登録(2)

はじめに

以下の記事の続きです。

今回は、以下の処理を実装します。

  • 楽天市場 注文確認メール解析登録処理:libManageRakutenOrder
  • Amazon 注文確認メール解析登録処理:libManageAmazonOrder
  • GooglePlay 注文確認メール解析登録処理:libManageGooglePlayOrder

全てのコード

中身は動かしてもらえればわかるので、全てのコードに行きます。

楽天市場 注文確認メール解析登録処理(libManageRakutenOrder)

ファイル名(ライブラリ名):libManageRakutenOrder.gas

/*
 * 楽天市場の注文内容をリストに追加してGoogle Calendarに登録するライブラリ
 * 
 * ・Google Calenderに「楽天注文」のタイトルで終日イベントが作成される。
 * ・OrderManagementから呼ばれて処理する
 * 
 * 2021/12/04 Created by N.Sekiya
 */

// 検索文字列(注文リスト作成用)
var SHOP_NAME = '[ショップ名]   ';
var SHIPPING = '送料計';
var POINT = 'ポイント利用 ';
var COUPON = 'クーポン利用 ';
var RA_COUPON = 'ラ・クーポン利用';
var PAYMENT = 'お支払い金額';

// 検索文字列(カレンダー登録用)
var CUT_START = 'この度は楽天市場内のショップ';

function register(message, calendar, orderlist) {

  var body = message.getPlainBody();   // HtmlメールからPlain textの本文を取得する
  var startTime = message.getDate();
  var endTime = new Date(startTime.getTime() + 10 * 60000);
  //Logger.log("body=" + body);

  var itemName = null;
  var shopName = null;
  var price = null;
  var count = null;
  var payment = null;
  var shipping = null;
  var point_used = null;
  var point_get = null;
  var coupon_used = null;
  var flgItem = 0;
  var flgRaCoupon = 0;
  var contents = null;      // 登録内容
  var flgAdd = 0;           // 追加フラグ(0:追加しない、1:追加する)

  // 注文メールの内容確認
  var rows = body.split("\n");
  for (var i in rows) {
    var row = rows[i];

    // 情報抽出
    if (row.indexOf(SHOP_NAME) >= 0) {
      shopName = row.replace(SHOP_NAME, '');
    } 
    else if(row.match(/^\[商品\]/)){
      flgItem = 1;
    }
    else if(row.match(/^----------/)){
      flgItem = 1;
    }
    else if(row.match(/^価格/)){
      var strs = row.split(' ');
      price = strs[2].replace('(円)', '');
      count = strs[4].replace('(個)', '');

      // 価格情報取得段階でスプレッドシートに登録する
      libAddOrderToList.registOderInfoToSpreadSheet(
        orderlist, '', startTime, '楽天市場', itemName, price, count, shopName);
    }
    else if(shipping == null && row.indexOf(SHIPPING) >= 0){
      shipping = row.replace(SHIPPING, '').replace('(円)', '').replace('円', '');
    }
    else if(point_used == null && row.indexOf(POINT) >= 0){
      point_used = row.replace(POINT, '').replace('(円)', '').replace('(円)', '');
    }
    else if(coupon_used == null && row.indexOf(COUPON) >= 0){
      coupon_used = row.replace(COUPON, '').replace('(円)', '').replace('(円)', '');
    }
    else if(coupon_used == null && row.indexOf(RA_COUPON) >= 0){
      flgRaCoupon = 1;
    }
    else if(row.match(/今回のお買い物で.*ポイント獲得予定/)){
      point_get = row.replace('今回のお買い物で', '').replace('ポイント獲得予定', '');
    }
    else if(row.match(/今回のお買い物で獲得するポイント/)){
      point_get = row.replace('今回のお買い物で獲得するポイント', '');
    }
    else if(row.match(/合計.*\(円\)/)){
      payment = row.replace('合計', '').replace('(円)', '');
    }
    else if(payment == null && row.indexOf(PAYMENT) >= 0){
      payment = row.replace(PAYMENT, '').replace('(円)', '').replace('(円)', '');
    }

    if(flgItem == 1){
      flgItem++;
    }
    else if(flgItem == 2){
      itemName = row;
      flgItem = 0;  // 商品名最初の1行のみ抽出する
    }

    if(flgRaCoupon == 1 || flgRaCoupon == 2){
      flgRaCoupon++;
    }
    else if(flgRaCoupon == 3){
      // -10(円) x 1(枚) = 10(円)
      var strs = row.split(' ');
      coupon_used = '-' + strs[8].replace('(円)', ''); 
      //Logger.log('coupon_used=' + coupon_used);
      flgRaCoupon = 0;       
    }

    //  カレンダー登録内容抽出 --->>
    // 切り取り開始位置確認
    if (row.indexOf(CUT_START) >= 0) {
      flgAdd = 1;
    } 

    if(flgAdd){
      if(contents == null){
        contents = row;
      }
      else{
        contents = contents + row + '\n';
      }
    }
    // <<--- カレンダー登録内容抽出用    
  }

  // 追加情報をスプレッドシートに登録
  if(shipping == null) shipping = 0;
  if(point_used == null) point_used = 0;
  if(coupon_used == null) coupon_used = 0;
  libAddOrderToList.registOderInfoToSpreadSheetSub(
    orderlist, '', shipping, point_used, coupon_used, payment, point_get);

  //  Googleカレンダーに登録
  libCtrlCalendar.registCalendar(
    calendar, '楽天市場', startTime, endTime, contents, CalendarApp.EventColor.GREEN);
}

処理内容については以下の記事を参照ください。

Amazon 注文確認メール解析登録処理(libManageAmazonOrder)

ファイル名(ライブラリ名):libManageAmazonOrder.gas

/*
 * Amazonの注文内容をリストに追加してGoogle Calendarに登録するライブラリ
 * 
 * ・Google Calenderに「Amazon注文」のタイトルで終日イベントが作成される。
 * ・OrderManagementから呼ばれて処理する
 * 
 * 2021/12/04 Created by N.Sekiya
 */

var BORDER ='............................................................................';

function register(message, calendar, orderlist) {

  var body = message.getPlainBody();   // HtmlメールからPlain textの本文を取得する
  var startTime = message.getDate();
  var endTime = new Date(startTime.getTime() + 10 * 60000);
  //Logger.log("body=" + body);

  var order_number = null;
  var itemName = null;
  var shopName = null;
  var price = null;
  var count = null;
  var payment = null;
  var shipping = null;
  var point_used = null;
  var point_get = null;
  var flgItem = -1;
  var contents = ''; 

  // 注文メールの内容確認
  var rows = body.split("\n");
  for (var i in rows) {
    var row = rows[i];

    // 情報抽出
    if(row.match(/^注文番号: /)){
      order_number = row.replace('注文番号: ', '');
    }
    else if(row.match(/^Amazonポイント:/)){
      point_used = row.replace('Amazonポイント:', '').replace('¥', '');
    }
    else if(row.match(/^注文合計:/)){
      payment = row.replace('注文合計:', '').replace('¥', '');
    }
    else if(order_number != null && payment != null && row.indexOf(BORDER) >= 0){
      flgItem *= -1;
    }
    else{
      if(flgItem > 0){
        if(row.match(/販売: /)){
          shopName = row.replace('販売: ', '');

          // 価格情報取得段階でスプレッドシートに登録する
          //Logger.log('itemName=' + itemName + ' shopName=' + shopName);
          libAddOrderToList.registOderInfoToSpreadSheet(
            orderlist, '', startTime, 'Amazon', itemName, price, 1, shopName);
          itemName = null;           
        }
        else{
          row = row.replace('\r', '');
          if(row.length > 0 && itemName == null){
            itemName = row;
          }
          else if(row.length > 0 && itemName != null){
            itemName += ' ' + row;
          }
        }
      }
    }

    //  カレンダー登録内容抽出 --->>
    contents = contents + row;
    // <<--- カレンダー登録内容抽出用     
  }

  // 追加情報をスプレッドシートに登録
  if(shipping == null) shipping = 0;
  if(point_used == null) point_used = 0;
  if(point_get == null) point_get = 0;
  libAddOrderToList.registOderInfoToSpreadSheetSub(
    orderlist, '', shipping, point_used, 0, payment, point_get);

  //  Googleカレンダーに登録
  libCtrlCalendar.registCalendar(
    calendar, 'Amazon注文', startTime, endTime, contents, CalendarApp.EventColor.GREEN);
}

処理内容については以下の記事を参照ください。

GooglePlay 注文確認メール登録解析処理(libManageGooglePlay)

ファイル名(ライブラリ名):libManageGooglePlay.gas

/*
 * GooglePlayの注文内容をリストに追加してGoogle Calendarに登録するライブラリ
 * 
 * ・Google Calenderに「GooglePlay注文」のタイトルで終日イベントが作成される。
 * ・OrderManagementから呼ばれて処理する
 * 
 * 2021/12/04 Created by N.Sekiya
 */

// 検索文字列(カレンダー登録用)
var CUT_START = 'Thank you';
var CUT_END = 'Questions? Visit';

function register(message, calendar, orderlist) {

  var body = message.getPlainBody();   // HtmlメールからPlain textの本文を取得する
  var startTime = message.getDate();
  var endTime = new Date(startTime.getTime() + 10 * 60000);  
  //Logger.log("body=" + body);

  // 注文リスト登録用変数
  var itemName = null;
  var shopName = null;
  var price = null;
  var count = null;
  var payment = null;
  var shipping = null;
  var point_used = null;
  var point_get = null;
  var flgItemName = null;
  var flgPointGet = null;

  // カレンダー登録用変数
  var contents = null;      // 登録内容
  var flgAdd = 0;           // 追加フラグ(0:追加しない、1:追加する)

  // 注文メールの内容確認
  var rows = body.split("\n");
  for (var i in rows) {
    var row = rows[i];

    // ---< 英語版メールの処理 >---
    if(row.match(/^Item Price/)){
      row = row.replace('\r', '');
      flgItemName = 1;
    }
    else if(row.match(/Total:/)){
      row = row.replace('Total:', '').replace('/month', '').replace('¥', '');
      payment = row;
      flgItemName = 0;
    }
    else if(row.match(/^Play Points earned/)){
      flgPointGet = 1;
    }
    else if(row.match(/^Questions\? Visit /)){
      shopName = row.replace('Questions? Visit ', '').replace('.', '');
    }

    // ---< 日本語版メールの処理 >---
    else if(row.match(/^アイテム 価格/)){
      row = row.replace('\r', '');
      flgItemName = 1;
    }
    else if(row.match(/合計: /)){
      row = row.replace('合計: ', '').replace('/月', '').replace('/年', '').replace('¥', '');
      payment = row;
      flgItemName = 0;
    }
    else if(row.match(/Play ポイントを獲得しました/)){
      flgPointGet = 1;
    }
    else if(row.match(/^ご不明な点がありましたら、/)){
      shopName = row.replace('ご不明な点がありましたら、', '').replace('にお問い合わせください。', '').replace('ヘルプセンター', '');
    }

    if(flgItemName){
      if(itemName == null){
        itemName = '';
      }
      else{
        row = row.replace('\r', '');
        if(row.length > 0){
          itemName += ' ' + row;  
        }         
      }
    }

    if(flgPointGet){
      if(point_get == null){
        point_get = 0;
      }
      else{
        point_get = row.replace('+', '');
        flgPointGet = 0;
      }
    }

    // カレンダー登録内容抽出 --->>
    // 切り取り開始位置確認
    if (row.indexOf(CUT_START) >= 0) {
      flgAdd = 1;
    } 
    else if(row.indexOf(CUT_END) >= 0){
      flgAdd = 0;
    }

    // CUT_STARTからCUT_ENDまでの間を取得する
    if(flgAdd){
      if(contents == null){
        contents = row;
      }
      else{
        contents = contents + row + '\n';
      }
    }
    // <<--- カレンダー登録内容抽出用
  }

  libAddOrderToList.registOderInfoToSpreadSheet(
            orderlist, '', startTime, 'GooglePlay', itemName, price, 1, shopName);
  libAddOrderToList.registOderInfoToSpreadSheetSub(
            orderlist, '', 0, 0, 0, payment, point_get);

  //  Googleカレンダーに登録
  libCtrlCalendar.registCalendar(
    calendar, 'GooglePlay注文', startTime, endTime, contents, CalendarApp.EventColor.GREEN);
}

処理内容については以下の記事を参照ください。

まとめ

コードばかりですが、基本コピペで行けます。

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

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