魔王テサギョウを倒せ_その1_Gmailとスプレッドシートを連携して業務量を半減させたぜ
自己紹介・記事の背景
初めまして!ひよこマークIIです。
業界未経験でclocoに入社(転籍?)し、いろいろなことをやっていたところ、気付けばGoogle Apps Script(以降GASと書いちゃいます!)を書いていました。
さてさて、ひよこマークIIは
一定のフォーマットでシステムから送られてくるメールを、ひたすらスプレッドシートに転記する作業をしている時期がありまして。
ある月、そのメール数が300件を超え、心が折れかけて「誰か手伝ってくれる人いませんか!?」とすた丼部長に泣きついたところ、頂いた策が「GASでの自動化」でした。
開発未経験の筆者が、軽い気持ちでトライするもガッツリ自動化出来てしまいました。
「転籍したら業務量半減させちゃった件」って作品があれば確実に勇者枠ですね。
そんな業務量半減系勇者を増やしたく、本記事を書きます。
この記事を読んだ皆で、徒党組んで魔王テサギョウを倒そうぜ!!
今回の記事について概要
目的
Gmailで受信したメールを見て、スプレッドシートに転記する
という作業を、GASとスプレッドシートを連携して、自動化しちゃいます。
この記事の対象者
- Gmailで受信したメールの内容を、手動で転記した経験がある方。
- 自動化とか業務効率化って聞くと気になっちゃう方。
- GASのこと気になっているけど、何したらいいかわからないって方。
- 「AIが活躍する時代になんで手作業なんだよォ!」と愚痴をこぼしたことがある方。
一つでも該当する方は、GASにだんだん心魅かれていくと思います。
(筆者は上から4番目です。)
概要
以下のステップで、自動転記を実現します。
- GASの準備
- 検索条件にヒットするGmailのスレッドを取得
- スレッドからメールを一つずつ取得
- メールの本文を取得
- 書き込み先の指定と値の転記
- トリガーの設定
ザックリ仕様
毎朝8時~9時に自動実行
Gmailで、件名が「問い合わせ」かつ「未読」のメールの情報を取得する
メールから取得する内容は、下記4点
- 問い合わせ番号
- 問い合わせ件名
- ご利用商品
- ご連絡先
やってみた
1. GASの準備
まずは値を転記する先のスプレッドシートを作成しましょう。
そのスプレッドシートから、GASエディタを立ち上げるために以下の操作をします。
①「拡張機能」を押下
➁「Google Apps Scripts」を押下
↓このような画面が開きます
2.検索条件にヒットするGmailのスレッドを取得
ここから実際に記述していきます。
GmailApp.search()というメソッドを用いて、欲しい情報があるメールを探します!
今回は、「件名が『問い合わせ』である」メールを取得しようと思います。
↓のように記述してみます。
function myFunction(){
// 検索条件にヒットするスレッドを取得
const query = 'Subject:問い合わせ is:unread';
const threads = GmailApp.search(query);
3.スレッドからメールを一つずつ取得
ここでミソなのが、GmailApp.search()メソッドが取得するのは、スレッドであるということです。
※↓スレッドは添付画像のような、メールの束です。
そのため、取得したスレッドを分解して、スレッド内のメールの数だけ、メールの中身を取得する処理を繰り返します。
function myFunction() {
// 検索条件にヒットするスレッドを取得する
const query = 'Subject:問い合わせ is:unread';
const threads = GmailApp.search(query);
// スレッド内のメールの数だけ繰り返す
threads.forEach(function(thread) {
const messages = thread.getMessages();
messages.forEach(function(message) {
// メール本文を取得し、取得した内容をplainBodyと定義する
const plainBody = message.getBody();
}
}
4.メールの本文を取得
メール内の、「ここの情報を取りたい」って部分を定義していきます。
今回は、以下4点を取得します。
- 問い合わせ番号
- 問い合わせ件名
- ご利用商品
- ご連絡先
~
messages.forEach(function(message) {
// メール本文を取得し、取得した内容をplainBodyと定義する
const plainBody = message.getBody();
//それぞれ↓のように定義。
const inquiryNumber = plainBody.match(/問い合わせ番号:(.*)/);
const inquirySub = plainBody.match(/問い合わせ件名:(.*)/);
const productId = plainBody.match(/ご利用商品ID:(.*)/);
const contactNumber = plainBody.match(/ご連絡先:(.*)/);
~
5.書き込み先の指定と値の転記
ここまでで、狙いの値を取得する流れは出来ました。
ここからは、書き込み先のスプレッドシートを指定していきます。
~
//スプレッドシートを指定
const ss = SpreadsheetApp.openById('{※1 スプレッドシートのID}');
//スプレッドシート内のどのシートか指定
const sheet = ss.getSheetByName('{※2 スプレッドシートのシート名}');
//シート内の最終行を取得。その次の行(+1)に書き込みたいので、その行を定義
const lastRow = sheet.getLastRow() + 1;
//取得した値を書き込み
sheet.getRange(lastRow, 1).setValue(inquiryNumber[1]);
sheet.getRange(lastRow, 2).setValue(inquirySub[1]);
sheet.getRange(lastRow, 3).setValue(productId[1]);
sheet.getRange(lastRow, 4).setValue(contactNumber[1]);
});
thread.markRead();
~
ちなみに、この例では未読のメールに対して処理を行っているので、処理後に既読にする処理なんかもつけます。thread.markRead()ってやつです。
※1 スプレッドシートのIDは、スプレッドシートのURLの「d/○○○○○○○○○○○○/edit~」の、○の部分です!
※2 シート名は、実際に転記先とするシートの名前を設定します!
6.トリガーの設定
GASでは簡単にトリガー設定が出来ます!
↓エディタ画面左部の、目覚まし時計のアイコンにカーソルを持っていくと、「トリガー」と表示されますので、そこを押下します。
↓画像のような画面が表示されます。画面右下の「トリガーを追加」を押下します。
↓画像のような画面が表示されます
今回は、「イベントのソースを選択」のプルダウンから「時間主導型」にします。
今回は毎日午前8時~9時の間に自動で処理を行ってくれるようにしたいので、以下のようなトリガー設定としました。
「時間ベースのトリガーのタイプを選択」のプルダウンから、「日付ベースのタイマー」を選択
「時刻を選択」から「午前8時~9時」を選択
画面右下の「保存」を押下
所感
以上、「Gmailとスプレッドシートを連携して業務量を半減させたぜ」の回でした
ポロっと出た筆者の泣き言から、本GAS作成にいたりました。 必要は発明の母と言いますが、泣き言は効率化の母でしょうか。
非プログラマの私が作りましたが、執筆現在も問題なく動いています。 手動で行っていたメール転記作業がごっそり自動化できたため、会社も筆者もハッピーです。
非プログラマの方々も是非お試しください。 筆者は新たな効率化を探す旅に出ます。
参考
ソースコードの全体です。
シートの定義場所や、値の持ち方&転記の仕方など多少お粗末ですが
大枠の流れがわかりやすいので、下記のようにまとめました。
function myFunction() {
// 検索条件にヒットするスレッドを取得する
const query = 'Subject:問い合わせ is:unread';
const threads = GmailApp.search(query);
// スレッド内の最下行 + 1を取得
const lastRow = sheet.getLastRow()+1;
// スレッド内のメールの数だけ繰り返す
threads.forEach(function(thread) {
const messages = thread.getMessages();
messages.forEach(function(message) {
// メール本文を取得し、取得した内容をplainBodyと定義する
const plainBody = message.getBody();
const inquiryNumber = plainBody.match(/問い合わせ番号:(.*)/);
const inquirySub = plainBody.match(/問い合わせ件名:(.*)/);
const productId = plainBody.match(/ご利用商品ID:(.*)/);
const contactNumber = plainBody.match(/ご連絡先:(.*)/);
const ss = SpreadsheetApp.openById('{※1 スプレッドシートのID}');
const sheet = ss.getSheetByName('{※2 スプレッドシートのシート名}');
// セルを取得して値を転記
sheet.getRange(lastRow, 1).setValue(inquiryNumber[1]);
sheet.getRange(lastRow, 2).setValue(inquirySub[1]);
sheet.getRange(lastRow, 3).setValue(productId[1]);
sheet.getRange(lastRow, 4).setValue(contactNumber[1]);
// 次のデータ転記対象行を指定
lastRow += 1
});
thread.markRead();
});
}