Google Apps Scriptにチャレンジ!~えりかの部屋~ | Be & Do Inc.

ブログ

Google Apps Scriptにチャレンジ!~えりかの部屋~

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

スタッフえりかです。
akemasiteあけましておめでとうございます~🎍
今年は、ほぼ日手帳を買ってみたので、おまけページにある「My 100」(やりたいことなど自由なテーマで100個書く)を書き出してみよう!と思い立ったんですが、結局4つしかなかった・・・(。-∀-)毎年やりたいことがたくさんある気がしているのですが、いざ書いてみると、あれ?少ない・・・。と気づきがありました。視覚化するって大切ですね。
なんだか今年は目標達成できそうな気がするぞ~☆彡

Google Apps Script で特定のメールをリスト化したい!

Google Apps for work。便利ですよね。今は「G Suite」というサービス名なっていますが、Be&Doでも一部Googleを使っています。

会社のドメインに届いたメールもGoogleで確認できるようにしているので、webサイトから何かのお申し込みや問合せが届いた場合、そちらで確認することが多いです。

そう。メール。お問い合わせやお申込みの内容は一通一通バラバラに届きますよね。
いちいちタグ付けしていくのも面倒だし、「一気にリストになっちゃわないかな」という依頼が。

ウェブ初心者(いつまで初心者やねんというツッコミはさておき)の私は「わーい、新しいことができる~」と喜び勇んで取り掛かったわけです。

今回は、メール(Gmail)に来た内容をスプレッドシートに抽出します。

ここで必要なのは、「Google Apps Script」。JavaScriptでコードを書いてGoogle Appsをいろいろ便利に整えることができる機能です。スプレッドシートだけではなくGoogle Appsの機能をまたがって利用できるのがいいところです。

ググって調べつつ、Googleドライブの「新規」からその他を選ぶと出てくるそうなんですが、見当たらなかったので、とりあえずスプレッドシートを開いてメニューのツールからスクリプトエディタを開きました。
(後で、アプリを追加しすれば「新規」にも表示されることがわかりました)

エディタを開くとmyFunction()がすでに書かれているのでこの中にコードを書いていきます。function名をgetMail()という名前にしました。

●メールから内容を取り出してスプレッドシートに

やりたいこと
SpreadsheetApp.getActiveSheet()で選択しているシートをとってきます
GmailApp.search()で抽出したいメールを特定します
③メールの日付、メールの本文を整形して、sheet.getRange().setValue()でセルの内容を変更(書き出し)します

function getMail() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var threads = GmailApp.search('subject:"~のお問合せ"');
  var row = 2;
 
  for(var n in threads){
    
    var thd = threads[n];
    var msgs = thd.getMessages();
    
    for(var m in msgs){

      var msg = msgs[m];
      var date = msg.getDate();  
      sheet.getRange(row, 1).setValue(date);
      
      //メール本文の不要な文字列を削除
      var result = msg.getBody().replace(/氏名:/,'')
      .replace(/メール:/,'')
      .replace(/企業・団体・屋号名:/,'')
      .replace(/電話番号:/,'')
      .replace(/▼質問など:/,'')
      .replace(/--/,'');
      
      //改行で分割
      var contents = result.split("\n");
      
      for(j=0; j < contents.length; j++){
        sheet.getRange(row, j+2).setValue(contents[j]);
      }
      row++
    }    
    Utilities.sleep(1000);
  }
}
●思わぬ落とし穴にズボッと。

実際これを実行してみると、件名が「~のお問合せ」を毎回すべて取得して上書きするようになっていました。
なので、未読メールだけ抽出できないかな~と思い、GmailApp.searchにis:unread をつけたしてみました。

var threads = GmailApp.search('is:unread subject:~のお問い合わせ');
var row = sheet.getLastRow() + 1;

また、getLastRow() + 1でリストの最終行に追加していくようにしました。
これで【件名:~のお問合せの未読メール】が追加されてリストになるぞ!と思って実行してみると・・・

なぜだ!またもや「~のお問合せ」のメールをすべて取得していました。getLastRow() + 1しているので、最終行にすべてが追加されている・・・(。-∀-)

実は GmailApp.search('is:unread subject:~のお問合せ'); でとってくるものは「未読で件名が『~のお問合せ』すべてのスレッド」だったんです。

なんという罠。

そのため、for文の中で、if(msg.isUnread())でそのスレッドが未読かどうか見てあげないといけないんですって。

そして最終的にできたコードがこちらです。(途中は同じなので省略)

function getMail() {  
  var sheet = SpreadsheetApp.getActiveSheet();
  var threads = GmailApp.search('is:unread subject:"~のお問い合わせ"');
  var row = sheet.getLastRow() + 1;  
  
  for(var n in threads){
    
    var thd = threads[n];
    var msgs = thd.getMessages();
    
    for(var m in msgs){
      var msg = msgs[m];
 
      if(msg.isUnread()){
        
        var date = msg.getDate();
        sheet.getRange(row, 1).setValue(date);        
        
  ~~~~~~~~~ 省略 ~~~~~~~~~~~
        
        row++     
      }      
    }
    // スレッドを既読にする
    thd.markRead();
    Utilities.sleep(1000);
  } 
}

最後に、自動でスクリプトが動くように、時計のマークみたいなのを押してトリガーを設定。スクリプトを1時間に1回実行するように設定しておきました。

新しいことに取り組むときは、本を読んだり動画を見たりして勉強することは多々ありますが、やっぱり作ってみる!やってみる!が一番楽しいですね。
Doをすると、悩みながらもいろんな発見があって、次につなげようというやる気になります♪
えりか
Be&Doのウェブ担当としてマーケティングのアシスタントや、システム開発、運用に従事しています。社内の出来事やHabi*doの使い方をはじめとする情報を発信していきます~♪

関連記事

この記事を書いたメンバー

えりか
えりか
Be&Doのウェブ担当としてマーケティングのアシスタントや、システム開発、運用に従事しています。社内の出来事やHabi*doの使い方をはじめとする情報を発信していきます~♪

メンバー

  • 石見 一女
  • 岡本 映一
  • 橋本 豊輝
  • 舞田美和
  • えりか
  • 藤井雄吾
  • みさ
  • マーク
  • 雪丸由香
  • Zheng Li
  • 俣野八重
  • 琴地悠太
  • 持部 ミカ
  • Be&Do inc.

最近の記事

Facebook

Twitter

ページ上部へ戻る