STUDY WITH ME / Reskilling

セキュリティでは、ゼロトラスト/マイクロセグメンテーション について情報を収集しています。 企業の活動では脱炭素経営について情報を収集しています。 インフラ設計・構築、ハードウェア選定から、アプリ、Javaチューニング、使えるDX、などITコンサルティング業務を会社員として従事しています。   また、脳内から零れ落ちているナレッジ(確認の意味で検索、ど忘れして検索、脳内のバージョンアップ、最新情報へのアップデート)をまとめています。(主に、運用系ツール、開発Java, C++, C#, Python, Swift など)

Gmail to Notion w/GAS API

Table of contents
GASを使って Gmail の未読を定期的にチェックして処理をする
💬 Answer

Google Apps Script (GAS)を使ってGmailの未読メールを定期的にチェックし、特定の処理を行います。

  1. メールを取得し、未読メールだけをフィルターする
  2. それぞれの未読メールに対して処理を行う(例えば、メールの本文をチェックし、特定のキーワードがあるかを確認する)
  3. 特定の条件を満たすメールがあった場合、それに対して何か行動を取る(例えば、自動的に返信する)

以下にこれを実装する簡単なスクリプトを示します。このスクリプトは、未読メールをチェックし、特定のキーワード(ここでは"重要")が本文に含まれている場合、そのメールに自動的に返信します。

function checkUnreadAndReply() {
  var threads = GmailApp.search('is:unread'); // 未読のメールを検索
  
  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    
    for (var j = 0; j < messages.length; j++) {
      if (messages[j].isUnread()) { // 未読のメッセージのみ処理
        var body = messages[j].getPlainBody(); // メッセージの本文を取得
        if (body.indexOf('重要') !== -1) { // 本文に"重要"という単語が含まれている場合
          // 自動返信
          GmailApp.sendEmail(
            messages[j].getFrom(), // 送信元アドレスに返信
            '自動返信: あなたのメールを受け取りました', // タイトル
            'あなたのメールを受け取りました。必要に応じて後ほど返信いたします。' // メッセージ
          );
          messages[j].markRead(); // メッセージを既読にする
        }
      }
    }
  }
}

このスクリプトを定期的に実行したい場合、Google Apps Scriptのトリガーを使います。以下の手順で設定します:

  1. スクリプトエディターで「編集」メニューを選択
  2. 「現在のプロジェクトのトリガー」をクリック
  3. 「新規トリガーを追加」をクリック
  4. 実行する関数を選択し、「checkUnreadAndReply」を選択
  5. 実行の頻度を選択(例えば、1時間ごとに実行)

これで、Gmailの未読メールを定期的にチェックし、特定の処

HTMLのメール本文の取得方法
💬 Answer

HTML形式でのメール本文を取得するには、GmailMessage オブジェクトの getBody() メソッドを使用します。このメソッドはメールの本文をHTML形式の文字列として返します。以下のスクリプトでは未読のメールからHTML形式の本文を取得します。

function checkUnreadAndReply() {
  var threads = GmailApp.search('is:unread'); // 未読のメールを検索
  
  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    
    for (var j = 0; j < messages.length; j++) {
      if (messages[j].isUnread()) { // 未読のメッセージのみ処理
        var body = messages[j].getBody(); // HTML形式のメッセージ本文を取得
        if (body.indexOf('重要') !== -1) { // 本文に"重要"という単語が含まれている場合
          // 自動返信
          GmailApp.sendEmail(
            messages[j].getFrom(), // 送信元アドレスに返信
            '自動返信: あなたのメールを受け取りました', // タイトル
            'あなたのメールを受け取りました。必要に応じて後ほど返信いたします。' // メッセージ
          );
          messages[j].markRead(); // メッセージを既読にする
        }
      }
    }
  }
}

ただし、HTML形式の本文から特定のキーワードを検索する場合は注意が必要です。なぜなら、HTMLタグの中や属性の中にある文字列も検索対象になるため、期待した結果が得られないことがあるからです。その場合は、HTMLをプレーンテキストに変換する方法や、正規表現を使って特定のHTML要素だけを対象に検索する方法などが考えられます。

NotionのDBへメールを書き出す
💬 Answer

Google Apps Script(GAS)とNotion APIを組み合わせて、GmailのメールをNotionのデータベースに書き出すことが可能です。

以下は、このプロセスの基本的な手順です。

  1. Notion APIのセットアップ
    • Notionでアカウントを作成し、Notion Integrationを作成します。
    • 作成したIntegrationにデータベースへのアクセス権を付与します。
    • IntegrationのSecret APIキーを取得します。
  2. GASのセットアップ
    • Google Apps Scriptのプロジェクトを作成します。
  3. スクリプトを書く
    • Gmailからメールを取得するスクリプトを書きます。
    • 取得したメールをNotionのデータベースに書き込むためのスクリプトを書きます。
  4. スクリプトを定期的に実行するためにトリガーを設定します。

以下は、これを実現するための基本的なGASのスクリプトの例です。この例では、未読のメールをNotionのデータベースに書き込む処理を行っています。

var NOTION_API_KEY = 'YOUR_NOTION_API_KEY';
var NOTION_DATABASE_ID = 'YOUR_NOTION_DATABASE_ID';

function writeToNotion() {
  var threads = GmailApp.search('is:unread');
  
  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    
    for (var j = 0; j < messages.length; j++) {
      if (messages[j].isUnread()) {
        var emailSubject = messages[j].getSubject();
        var emailBody = messages[j].getPlainBody();
        
        // Notionに書き込む
        createNotionPage(emailSubject, emailBody);
        
        // オプション:メールを既読にする
        messages[j].markRead();
      }
    }
  }
}

function createNotionPage(title, content) {
  var apiUrl = "https://api.notion.com/v1/pages";
  
  var data = {
    "parent": { "database_id": NOTION_DATABASE_ID },
    "properties": {
      "Name": {
        "title": [
          {
            "text": {
              "content": title
            }
          }
        ]
      }
    },
    "children": [
      {
        "object": "block",
        "type": "paragraph",
        "paragraph": {
          "text": [
            {
              "content": content
            }
          ]
        }
      }
    ]
  };
  
  var options = {
    "method" : "post",
    "contentType": "application/json",
    "headers": {
      "Authorization" : "Bearer " + NOTION_API_KEY,
      "Notion-Version": "2021-08-16"
    },
    "payload" : JSON.stringify(data)
  };
  
  UrlFetchApp.fetch(apiUrl, options);
}

注意事項:

  • 上記のスクリプトには、 NOTION_API_KEY NOTION_DATABASE_ID の値が設定されていません。これらの値は各自の環境に合わせて設定してください。
  • スクリプトは、全ての未読メールを対象にしています。メールを選択する条件は、 GmailApp.search 関数の引数を変更することでカスタマイズすることができます。たとえば、特定のラベルが付いたメールのみを対象にするといったことも可能です。
  • このスクリプトは、メールの本文をそのままNotionに書き込んでいます。HTML形式のメールをプレーンテキストに変換するなど、メールの内容をさらに処理する必要がある場合は、 getPlainBody 関数の代わりに getBody 関数を使用し、得られたHTMLを適切に処理してください。
メール本文は
💬 Answer

Notionのページに具体的なコンテンツやテキストを追加するには、 children フィールドを使用します。 children はページのブロックを表現する配列で、各ブロックはテキスト、見出し、リスト、画像などの種類を持つことができます。

例えば、以下のリクエストボディは、新しいページにテキストブロックを追加します:

{
  "parent": { "database_id": "YOUR_DATABASE_ID" },
  "properties": {
    "Name": {
      "title": [
        {
          "text": {
            "content": "YOUR_PAGE_TITLE"
          }
        }
      ]
    },
    // その他のプロパティ...
  },
  "children": [
    {
      "object": "block",
      "type": "paragraph",
      "paragraph": {
        "text": [
          {
            "type": "text",
            "text": {
              "content": "YOUR_PAGE_CONTENT"
            }
          }
        ]
      }
    }
    // その他のブロック...
  ]
  // その他の設定...
}

ここで、"YOUR_PAGE_CONTENT"はページの本文またはコンテンツです。この例では、テキストブロック( "type": "paragraph" )を追加し、そのテキストブロックに具体的なコンテンツを指定しています。

なお、各ブロックはそれぞれの種類に応じて異なる形式を持つため、具体的な形式はNotion APIのドキュメンテーションを参照してください。

また、 children フィールドを使用してページのコンテンツを追加することは、ページの作成時( POST /pages エンドポイント)だけでなく、ページの更新時( PATCH /pages/{page_id} エンドポイント)でも可能です。ただし、現時点ではNotion APIはページの既存のブロックを更新する機能を提供していないため、ページのコンテンツを更新するためには新しいブロックを追加する必要があります。

💡
GASは、無料でここまでできてしまうので、有料のクラウド間をつなぐジョブ系のツールを解約してもいいかも。リアルタイムを求めない場合は全然無料版でOK。マイクロソフトの PowerApps. Automate も、外部HTTP接続を使うと有料になるので、いまのところ GASは最強かも。

0