魔王テサギョウを倒せ_その1_Gmailとスプレッドシートを連携して業務量を半減させたぜ

ひよこマークII

自己紹介・記事の背景

初めまして!ひよこマークIIです。
業界未経験でclocoに入社(転籍?)し、いろいろなことをやっていたところ、気付けばGoogle Apps Script(以降GASと書いちゃいます!)を書いていました。

さてさて、ひよこマークIIは
一定のフォーマットでシステムから送られてくるメールを、ひたすらスプレッドシートに転記する作業をしている時期がありまして。
ある月、そのメール数が300件を超え、心が折れかけて「誰か手伝ってくれる人いませんか!?」とすた丼部長に泣きついたところ、頂いた策が「GASでの自動化」でした。
開発未経験の筆者が、軽い気持ちでトライするもガッツリ自動化出来てしまいました。

「転籍したら業務量半減させちゃった件」って作品があれば確実に勇者枠ですね。
そんな業務量半減系勇者を増やしたく、本記事を書きます。

この記事を読んだ皆で、徒党組んで魔王テサギョウを倒そうぜ!!

今回の記事について概要

目的

Gmailで受信したメールを見て、スプレッドシートに転記する

という作業を、GASとスプレッドシートを連携して、自動化しちゃいます。

この記事の対象者

  • Gmailで受信したメールの内容を、手動で転記した経験がある方。
  • 自動化とか業務効率化って聞くと気になっちゃう方。
  • GASのこと気になっているけど、何したらいいかわからないって方。
  • 「AIが活躍する時代になんで手作業なんだよォ!」と愚痴をこぼしたことがある方。

一つでも該当する方は、GASにだんだん心魅かれていくと思います。
(筆者は上から4番目です。)

概要

以下のステップで、自動転記を実現します。

  1. GASの準備
  2. 検索条件にヒットするGmailのスレッドを取得
  3. スレッドからメールを一つずつ取得
  4. メールの本文を取得
  5. 書き込み先の指定と値の転記
  6. トリガーの設定

ザックリ仕様
毎朝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();
  });
}
カテゴリー: 初心者

ひよこマークII