見出し画像

Gmailの特定のメールを自動でGoogle spreadsheetsに転記する+Glide

このノートは、SUNABACO DX人材育成講座の卒業制作で作成したアプリの機能について一部解説しています。


つくるもの

今回作るのはタイトル通りでもありますが、「Gmailの特定のメールを自動でGoogle spreadsheetに転記」し、その自動転記した内容をGlideで確認できるようにします。

補足:Glideについて

Glideはノーコードのアプリ開発ツールです。Googleのアカウントがあれば誰でも無料でアプリ開発を始めることができます。

今回の記事できること 例えば

ECサイトを運営している場合、週に数件のお問い合わせメールが届くかもしれません。
運営者はこれらのメールを手動でスプレッドシートに入力し、お問い合わせの対応状況を管理しているとします。

今回はこの手作業を自動化します。
特定のメールを自動的に収集し、アプリで簡単に確認できるようにします。また、アプリを使ってお問い合わせの対応状況も管理できるようにします。

完成イメージ

Gmailの特定のメールを自動でGoogle spreadsheetsに転記
Google spreadsheets を Glide と連携する

使用するツール、キーワード


ざっくり解説です。進め方としては、いきなり本番の前に、小さいところから試してみるのがおすすめです。

ChatGPTに聞いてみた

プロンプト

Gmail + Google spreadsheet で 特定のメールを自動でスプレッドシートに転記する方法

回答

GmailとGoogleスプレッドシートを組み合わせて特定のメールを自動的にスプレッドシートに転記する方法を説明します。
これを実現するためには、Google Apps Scriptを使用してGmailの特定のラベルを監視し、新しいメールが受信されたらその内容をスプレッドシートに書き込むスクリプトを作成する必要があります。以下に手順を示します

1. Googleスプレッドシートを開きます。
1.「ツール」メニューから「スクリプト エディタ」を選択します。
2.スクリプト エディタが開いたら、新しいスクリプトファイルを作成します。
3.以下のGoogle Apps Scriptコードを貼り付けます。

function watchInbox() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var label = GmailApp.getUserLabelByName("Your Label Name"); // 監視したいGmailのラベル名を指定
  
  var threads = label.getThreads();
  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];
      var subject = message.getSubject();
      var body = message.getPlainBody();
      var sender = message.getFrom();
      var date = message.getDate();
      
      // スプレッドシートにメールの情報を書き込む
      sheet.appendRow([date, sender, subject, body]);
      
      // メールを処理した後、ラベルを削除する場合は次の行を有効にする
      // threads[i].removeLabel(label);
    }
  }
}

解説

Gmailで集計したいメールにラベルをつけます。
今回やりたいことの「自動振り分け」、実はGmailの機能でできます。

Gmail の自動振り分け設定

詳しい解説はググった方がよいです。ざっくり説明します。

①Gmailのメール検索を使用します。集計したいメールが絞り込まれるように検索します。

②検索結果に全てチェックを入れます。アイコン「:」をクリックし、「メールの自動振り分け設定」をクリック

③フィルタを作成をクリック

④「ラベルをつける」にチェック。任意のラベルを割り当てます。
⑤「〜件の一致するスレッドにもフィルタを適用する」をチェック
⑥「フィルタを作成」をクリック

これでGmailの自動振り分け設定は完了です。
集計したいメールが一度で絞り込めない場合は、ラベルを分けて作成したあと、最終的に一つのラベルに集約するようにすると良いです。(詳しくは師匠に!すでに一部設定されています)


Google App Sheet (略称:GAS よみ:ガス)

Googleのサービスと連携して自動化を行うことができるプログラム言語です。ここでは細かい説明は省略して、ステップだけを説明します。

①Googleスプレッドシートを開きます。
②「拡張機能」>「App Script」を選択

③このような画面が開きます。「コード.gs」を編集します。function myFunction(〜を消し、chatGPTが書いたコードを貼り付けます。

④3行目を編集します。ラベル名を先ほど作成したものにします。
⑤保存をクリック

⑥実行
※メールが多いと時間がかかったり、処理が終わらない可能性もあります。その時は、ラベル絞り込みではなくsearchで、直近の数件のみに絞り込む方が良いです。

日次で実行する

トリガーを設定します。

「イベントのソースを選択」>時間主導型
「時間ベースのトリガーのタイプを選択」>日付ベースのタイマー
「時刻を選択」> 任意の時間

Glideへの連携

GlideのDBとして、作成したスプレッドシートを選択します。SYNC DATA として選択します。




その他

メールの添付ファイルを自動ダウンロードして、Googleドライブに保存する

転記済みのメールは処理しない

function watchInbox() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var label = GmailApp.getUserLabelByName("新しいラベル"); // 監視したいGmailのラベル名を指定
  
  var threads = label.getThreads();
  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];

      var processedLabel = GmailApp.getUserLabelByName("シート転記済");
      if (!processedLabel) {
        processedLabel = GmailApp.createLabel("シート転記済"); // Gmail上にラベル「シート転記済」が無かったらラベル新規作成
      }

      if (!message.isInLabel(processedLabel)) {
        var subject = message.getSubject();
        var body = message.getPlainBody();
        var sender = message.getFrom();
        var date = message.getDate();
        
        // スプレッドシートにメールの情報を書き込む
        sheet.appendRow([date, sender, subject, body]);
        
        // メールを処理したことを示すため、ラベルを付ける
        message.addLabel(processedLabel);
      }
    }
  }
}

ラベル絞り込みではなく、検索で絞り込む場合

GmailApp.search() を使用して特定の条件に合致するメールを検索し、それらのメールを取得することができます。このメソッドを使ってラベルを指定する代わりに、条件を指定してメールを検索し、該当するメールを取得することができます。

function watchInbox() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  // 特定の条件に基づいてメールを検索
  var threads = GmailApp.search('label:新しいラベル');
  
  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];

      var processedLabel = GmailApp.getUserLabelByName("シート転記済");
      if (!processedLabel) {
        processedLabel = GmailApp.createLabel("シート転記済"); // Gmail上にラベル「シート転記済」が無かったらラベル新規作成
      }

      if (!message.isInLabel(processedLabel)) {
        var subject = message.getSubject();
        var body = message.getPlainBody();
        var sender = message.getFrom();
        var date = message.getDate();
        
        // スプレッドシートにメールの情報を書き込む
        sheet.appendRow([date, sender, subject, body]);
        
        // メールを処理したことを示すため、ラベルを付ける
        message.addLabel(processedLabel);
      }
    }
  }
}


参考

より詳しい内容


ドキュメント


この記事が気に入ったらサポートをしてみませんか?