STAFF BLOG
1.62017
Google Apps Scriptにチャレンジ!~えりかの部屋~
スタッフえりかです。
あけましておめでとうございます~?
今年は、ほぼ日手帳を買ってみたので、おまけページにある「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をすると、悩みながらもいろんな発見があって、次につなげようというやる気になります♪