(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 へのサインインを求められます。GAS を使うアカウントでサインインします。
以下のような認可を求めるダイアログが出てくるので了承します。
認可の設定が終わるとワークシートの選択画面が出てきます。
Google spreadsheet で受け側のシートを作成します。名前は Microsoft365ToNotion くらいにしておきます。タイトル(Title)、差出人(Sender)、会話ID(Thread id)と送信元のアプリ(Source) を設定できるようにしておきます。
シートを選択すると自動的にタイトル行が読み込まれ、それぞれに何を書くかを設定できます(8/17 修正: 当初、会話IDを設定していましたが、メッセージIDに変更しました)。
ここまででフローのテストをしてみましょう。右上のテストを手動で実行し、Outlook にフラグを付けてみます。Google Spreadsheet を確認すると列が追加されています。
3 GAS スクリプトの作成
GAS の部分は前回の声でタスク登録の内容を GAS に落とし込むだけです。
最近、Script Properties が Apps Script の設定画面から入力できることがわかったので、ここで設定します。
あとは Toggle Block に ToDo ブロックを追加する処理を書きます。後でタスクデータベースに落とし込むことを考え、件名を To Do ブロックのテキストとし、差出人を本文に記載します。この差出人には Outlook へのリンクを付けておくことで、いつでもメールに戻れるようにしておきます。会話ID の最後の = がエスケープされないとうまく飛べないようなので、手動でエスケープしています。また、個別のメッセージへのリンクについては、以下の記事を参考にしました。
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 をしてみたところ、無事に日付未確定のタスクに登録されました。
リンクをクリックするとちゃんと Outlook のメッセージに飛びました。Inbox にあることを想定していますが、タスクが終わるまでは Inbox に入れたままにする運用をすることにします。
To Do リストを下のタスクデータベースのカレンダービューにドラッグすると、タスクページに昇格します。
変換されたタスクページでは、To Do ブロックのサブブロックがページのコンテンツに変わっています。このような仕様だったので、タイトルの方にリンクをつけず、サブブロックの方にメールへのリンクを付けました。タイトルにリンクがあるとクリックするのが面倒だからです。
4 GAS トリガの設定
あとは最後の仕上げでトリガを設定するだけです。外部から呼ばれることはないので、デプロイはせず HEAD を実行することにします。スプレッドシートが変更されたらトリガがかかり、先ほどの AddToDo が実行されます。
設定されるとこんな感じでリストになります。
最後にメールにフラグを付けてみます。無事に Notion にトリガが設定されました。
5. おわりに
とりあえず Outlook でフラグを付けるだけで、Notion の日付未確定にタスクが入るようになりました。ドラッグするとタスクに入ります。私の環境ではドラッグでの登録だと Google カレンダーに入らないのが残念ですが、これは Linked Database に期待しましょう。