【GAS】特定のメールを自動でデイリーノートに統合する方法
/ 6 min read
Table of Contents
WorkFlowyの進捗とかをテキストファイルにまとめたい
日記やアイデアを書くのに最適なオンラインサービスはWorkFlowyだと思う。 動作が軽く、回線がとぎれとぎれの我が家でも比較的いい感じに同期してくれるのが最大の推しポイント。 アウトライナーだから音声入力などでざくざく書いて整理は後ですればいい。
WorkFlowyのいいところは前日との編集差分を毎日メールで送ってくれるというところ。 で、これを毎日書いている日記ファイル(デイリーノート)に自動で統合したい。
できるさ、そう、Google Apps Script (GAS)ならね。
WorkFlowyからデイリーノートへの転記の流れ
結論から言うと以下のような流れで日記をデイリーノートに統合する。
【WorkFlowy】→【Gmail】→【Googleドライブ上のmarkdownファイル(デイリーノート)】
WorkFlowy側の処理
編集差分メールを目的のGoogleドライブと同じGoogleアドレスに送るようにする。 設定は右上の縦点3個のところから「settings」。
Gmail側の処理
フィルタ設定を使って、デイリーノートに統合したいメールにdailynoteタグをつける。1
from:(*@workflowy.com) subject:(Daily update)みたいな条件でいいだろう。
Google Apps Scriptを書く
関数を使いまわすので、前回と同じファイルに書く。
「直近14日以内に届いたdailynoteタグつきの未読スレッド50件」に対して、同じ日付2のデイリーノートに書き込む処理を行う。
デイリーノートはObsidian/Dailynoteフォルダにyyyy-mm-dd.mdという命名規則で入っているものとする。
function getFolder(parent, folname) { //フォルダ取得関数 if (parent null) { parent = DriveApp.getRootFolder(); }
const folders = parent.getFoldersByName(folname); let targetfol;
if (folders.hasNext()) { targetfol = folders.next(); } else { targetfol = null; } return targetfol;}
function appendToDailyNote() { //Gmailから特定のラベルがついたものだけデイリーノートに転記する
// 検索条件に該当するスレッドすべて取得 const query = 'label:dailynote is:unread newer_than:14d'; //検索条件 var threads = GmailApp.search(query, 0, 50);
threads.forEach(function (thread) { // スレッド内のメール一覧を取得 var messages = thread.getMessages();
messages.forEach(function (message) {
// メール本文を取得 var plainBody = message.getPlainBody();
//日付のフォーマット var d1 = Utilities.formatDate(message.getDate(), 'Asia/Tokyo', 'yyyy-MM-dd');
// 書き込むファイルを取得 // Obsidian\DailyNoteフォルダを取得する var folder = getFolder(getFolder(null, 'Obsidian'), 'DailyNotes');
//ファイル名は日付 var name = d1 + ".md";
// 内容を取得(一旦読み込んで書き込んで戻すしかないみたい) var targetfile = folder.getFilesByName(name); var file = null; if (targetfile.hasNext()) { // ファイルがあればファイル内容を読み込んで書き込む file = targetfile.next();
console.log(file.getName()); //debug
var blob = file.getBlob(); var text = blob.getDataAsString("utf-8"); text += "----------------\n\n"; text += plainBody;
file.setContent(text); } else { // ファイルがなければ新規作成 file = folder.createFile(name, content); }
//debug
});
// スレッドを既読にする thread.markRead(); });}あとはappendToDailyNote()を時間トリガで毎日実行するようにすれば、WorkFlowyで書いた日記を自動でテキストベースで保存できる。
やったね。
まとめ: IFTTTなどからGASに置き換え中
こういうことは昔はIFTTTを使っていたが、細かいルールが設定できなかったり、制限がきつくなってきたりして少し難しかった。 Google頼りの民なので、こういう自動化は、まずGASで出来ないか試すようにしている。
あと、Workflowyだと音声入力が使いやすくていい。 手で書くのと思考回路が違って戸惑うが、断片的なメモなら音声入力は十分に使えると感じた。 腕が痛いとき、手が離せないときに活用できそう。
ちなみに今回の記事も6割音声入力で書いている。「です・ます」使ってないのは、そっちの方がしゃべりやすいから……
参考にさせていただきました
- 【GAS】Gmailのメール本文をスプレッドシートに転記する方法 – Valmore
- Gmailの検索と内容取得をするGAS – TD シネックスブログ
- GoogleAppsScriptメモ - Qiita
最近読んだ本でも音声入力使えって書いてあったな……