【GAS】特定のメールを自動でデイリーノートに統合する方法

※当サイトは、アフィリエイト広告を利用しています

WorkFlowyの進捗とかをテキストファイルにまとめたい

日記やアイデアを書くのに最適なオンラインサービスはWorkFlowyだと思う。
動作が軽く、回線がとぎれとぎれの我が家でも比較的いい感じに同期してくれるのが最大の推しポイント。
アウトライナーだから音声入力などでざくざく書いて整理は後ですればいい。

WorkFlowyのいいところは前日との編集差分を毎日メールで送ってくれるというところ。
で、これを毎日書いている日記ファイル(デイリーノート)に自動で統合したい。

前に作ったもの: 

できるさ、そう、Google Apps Script (GAS)ならね。

WorkFlowyからデイリーノートへの転記の流れ

結論から言うと以下のような流れで日記をデイリーノートに統合する。

【WorkFlowy】→【Gmail】→【Googleドライブ上のmarkdownファイル(デイリーノート)】

WorkFlowy側の処理

編集差分メールを目的のGoogleドライブと同じGoogleアドレスに送るようにする。
設定は右上の縦点3個のところから「settings」。

WorkFlowy: メール設定の画面

Gmail側の処理

フィルタ設定を使って、デイリーノートに統合したいメールにdailynoteタグをつける。[1]
from:(*@workflowy.com) subject:(Daily update)みたいな条件でいいだろう。

Gmail: フィルタ条件の設定
フィルタ条件を設定した。
Gmail: 該当条件のメール
条件に該当するメールにラベルがついた。

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割音声入力で書いている。「です・ます」使ってないのは、そっちの方がしゃべりやすいから……

参考にさせていただきました

最近読んだ本でも音声入力使えって書いてあったな……

脚注

  1. WorkFlowyのほか、各種ショッピングサイトの購入履歴なんかもいいかもしれない[]
  2. WorkFlowyのDaily updateは翌日に届くので本当は前日のノートに書き込んだ方がいいが、手も痛いので細かいことは後回しにしよう[]
タイトルとURLをコピーしました