Outlook から日付未確定のタスクを作成 : Notion 解説 (63)

(8/17修正: うまくリンクが処理できないことがあったので、会話ID ではなくメッセージIDに変更し、リンクも修正しました)

1. はじめに

以前、Outlook の会議招集連絡から Notion タスクを作成する PowerAutomate を作成しました。誰かが私のカレンダーに会議を登録すると、自動的に Google カレンダーに転記され、GAS によって Notion のタスクが生成されるものです。これは今でもうまく動いています。

一方、メールにフラグを付けることで、タスクを生成するものも作っていました。上の応用でフラグが付くとNotion のタスクに登録されるものです。ただし、この手順では日付を設定することができないため、自動的に今日のタスクを設定していました。そのため、その後 Google カレンダーで移動するという二度手間が入っています(Notion のタスクはカレンダーで自動更新されるため)。

せっかく前回、以下の記事にて日付未確定のタスクの欄を作成したので、今後は Outlook 及び Teams のメッセージを日付未確定に登録するようにしようと思います。Outlook の方だけでかなり長くなってしまったので、Teams の方は次回に回します。Teams はもう少しかかりそうです。

2 PowerAutomate の設定

前回同様 Power Automate で新しいフローを作ります。

新しいフロー

自動化したクラウドフローを選択します。すでに MailToNotion は消してしまったので、同じ名前で作り直しましょう。利用するトリガは「電子メールにフラグが設定されたとき(V4)」です。

自動化したクラウドフロー

その後のフローとして、Google Sheets の「行の挿入」を選択します。

Google Sheets の行の挿入を追加

設定すると Google へのサインインを求められます。GAS を使うアカウントでサインインします。

Google サインイン

以下のような認可を求めるダイアログが出てくるので了承します。

認可の設定

認可の設定が終わるとワークシートの選択画面が出てきます。

ワークシートの選択画面

Google spreadsheet で受け側のシートを作成します。名前は Microsoft365ToNotion くらいにしておきます。タイトル(Title)、差出人(Sender)、会話ID(Thread id)と送信元のアプリ(Source) を設定できるようにしておきます。

用意した Google Spreadsheet

シートを選択すると自動的にタイトル行が読み込まれ、それぞれに何を書くかを設定できます(8/17 修正: 当初、会話IDを設定していましたが、メッセージIDに変更しました)。

書き出しの設定

ここまででフローのテストをしてみましょう。右上のテストを手動で実行し、Outlook にフラグを付けてみます。Google Spreadsheet を確認すると列が追加されています。

テスト成功

3 GAS スクリプトの作成

GAS の部分は前回の声でタスク登録の内容を GAS に落とし込むだけです。

hkob.hatenablog.com

最近、Script Properties が Apps Script の設定画面から入力できることがわかったので、ここで設定します。

Script Properties の設定

あとは Toggle Block に ToDo ブロックを追加する処理を書きます。後でタスクデータベースに落とし込むことを考え、件名を To Do ブロックのテキストとし、差出人を本文に記載します。この差出人には Outlook へのリンクを付けておくことで、いつでもメールに戻れるようにしておきます。会話ID の最後の = がエスケープされないとうまく飛べないようなので、手動でエスケープしています。また、個別のメッセージへのリンクについては、以下の記事を参考にしました。

www.web-dev-qa-db-ja.com

function addToDo() {
  const url = "https://api.notion.com/v1/blocks/" + toggleBlockId() + "/children"
  sendNotion(url, createPayload(), "PATCH")
}

function sendNotion(url, payload, method) {
  let options = {
    "method": method,
    "headers": {
      "Content-type": "application/json",
      "Authorization": "Bearer " + myNotionToken(),
      "Notion-Version": "2022-06-28",
    },
    "payload": payload ? JSON.stringify(payload) : null
  }
  // デバッグ時にはコメントを外す
  //Logger.log(options)
  Utilities.sleep(400);
  return JSON.parse(UrlFetchApp.fetch(url, options))
}

function createPayload() {
  const line = getLastLine()
  const link = line[3] == "Outlook" ? outlookLink(line[2]) : ""
  return {
    "children": [
      {
        "type": "to_do",
        "to_do": {
          "rich_text": [
            {
              "type": "text",
              "text": {
                "content": line[0]
              },
              "plain_text": line[0]
            }
          ],
          "children": [
            {
              "type": "paragraph",
              "paragraph": {
                "rich_text": [
                  {
                    "type": "text",
                    "text": {
                      "content": line[1],
                      "link": {
                        "url": link
                      }
                    },
                    "plain_text": line[1],
                  }
                ]
              }
            }
          ],
          "checked": false
        }
      }
    ]
  }
}

function outlookLink(str) {
  const urlEscape = str.replace("=", "%3D")
  return "https://Outlook.office.com/owa/?ItemID=" + urlEscape + "&viewmodel=ReadMessageItem&path=&exvsurl=1"
}

function getLastLine() {
  const sheet = SpreadsheetApp.getActiveSheet()
  const line = sheet.getLastRow()
  return  sheet.getRange("A" + line + ":D" + line).getValues()[0]
}

function myNotionToken() {
  return PropertiesService.getScriptProperties().getProperty("NOTION_API_KEY")
}

function toggleBlockId() {
  return PropertiesService.getScriptProperties().getProperty("TOGGLE_BLOCK_ID")
}

手動で addToDo をしてみたところ、無事に日付未確定のタスクに登録されました。

登録された To Do

リンクをクリックするとちゃんと Outlook のメッセージに飛びました。Inbox にあることを想定していますが、タスクが終わるまでは Inbox に入れたままにする運用をすることにします。

リンク先の Outlook のメッセージ

To Do リストを下のタスクデータベースのカレンダービューにドラッグすると、タスクページに昇格します。

タスクページに昇格

変換されたタスクページでは、To Do ブロックのサブブロックがページのコンテンツに変わっています。このような仕様だったので、タイトルの方にリンクをつけず、サブブロックの方にメールへのリンクを付けました。タイトルにリンクがあるとクリックするのが面倒だからです。

変換されたタスクページ

4 GAS トリガの設定

あとは最後の仕上げでトリガを設定するだけです。外部から呼ばれることはないので、デプロイはせず HEAD を実行することにします。スプレッドシートが変更されたらトリガがかかり、先ほどの AddToDo が実行されます。

トリガ設定

設定されるとこんな感じでリストになります。

設定されたトリガ

最後にメールにフラグを付けてみます。無事に Notion にトリガが設定されました。

フラグにより設定された To Do リスト

5. おわりに

とりあえず Outlook でフラグを付けるだけで、Notion の日付未確定にタスクが入るようになりました。ドラッグするとタスクに入ります。私の環境ではドラッグでの登録だと Google カレンダーに入らないのが残念ですが、これは Linked Database に期待しましょう。


www.notion.so