🐣

Todoistでタスクを完了したらスプレッドシートに追加する

2023/05/16に公開

概要・背景

GoogleカレンダーとTodoistを使用してタスク管理をしていますが、完了したタスクを一覧で確認したいです。
IFTTTでスプレッドシートへ追加することはできるのですが、Todoistから追加すると、日付は"May 15, 2023 at 10:30AM"のような形式になっています。
そこで、GASを使用してこの形式を"2023年5月15日 10:30"に変換します。
また、"2023年5月15日 10:30"から時間を削除し、"2023年5月15日"にします。
今回のタスク管理では、時間は重要ではないため、削除します。日付のみでフィルタリングできるのが利点です。

TodoistとIFTTTを準備する

Todoistと特定のGoogleカレンダーを、あらかじめめ同期しておきます。無料プランで大丈夫です。
Todoistの設定で、「完了した場合はカレンダーから削除する」としておきます。カレンダーがスッキリしますので。

IFTTTを作成します。無料プランで大丈夫です。
IFTTTで、Todoistを完了すると、SpreadsheetのROWの行に追加されるという指示を作ります。

Spreadsheetに追加する時、「Formatted row」を修正します。
これで、B列から値が追加されるようになります。

|||{{DueDate}}|||{{TaskContent}}||| {{TaskDescription}}||| {{LinkToTask}} 

日付を変換するGASを追加

B列に値があり、かつ対応するA列に値がまだ存在しない行を対象に、値を変換します。

トリガーは、2つ用意します。

  • スプレッドシートを「変更時」// 通常はIFTTTで追加時に更新される
  • 日付ベースの午前0時〜1時 // 変更時のトリガーでモレがあっても対応
function convertDateTime() {
  // スプレッドシートを取得
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // 操作するシートを取得 シート名は実際に合わせてください
  var sheet = ss.getSheetByName("シート1");

  // シートの最終行を取得
  var lastRow = sheet.getLastRow();
  
  // B列に値があり、対応するA列に値がない行を探す
  for (var i = 1; i <= lastRow; i++) {
    var cellB = sheet.getRange("B" + i);
    var cellA = sheet.getRange("A" + i);
    
    var valueB = cellB.getValue();
    var valueA = cellA.getValue();
    
    if (valueB && !valueA) {
      // "at "を削除
      var dateText = valueB.replace(' at ', ' ');

      // AM/PMを24時間形式に変換
      var timeFormat = dateText.slice(-2);
      var time = dateText.slice(-7, -2).trim();
      var hours = Number(time.split(':')[0]);
      var minutes = Number(time.split(':')[1]);
      
      // 時間部分が存在しない場合
      if (isNaN(hours) || isNaN(minutes)) {
        // 期待する形式に日付を調整
        var date = new Date(dateText);
      } else {
        if (timeFormat.toLowerCase() === 'pm' && hours !== 12) {
          hours += 12;
        } else if (timeFormat.toLowerCase() === 'am' && hours === 12) {
          hours = 0;
        }

        var formattedTime = hours.toString().padStart(2, '0') + ':' + minutes.toString().padStart(2, '0');
        var formattedDateText = dateText.slice(0, -7) + formattedTime;

        // 期待する形式に日付を調整
        var date = new Date(formattedDateText);
      }

      // 日本時間に変換
      var japanTime = Utilities.formatDate(date, "Asia/Tokyo", "yyyy'年'M'月'd'日'");

      // 変換した日時を別のセルに書き込む
      cellA.setValue(japanTime);
    }
  }
}

表示について

スプレッドシートでは、行に日付が整っていれば「条件でフィルタ」で「その間にあるxxxとxxx」で表示できるので
「2023年4月1日」から「2023年4月30日」のタスク一覧を表示することも可能です。

おわりに

これで、Googleカレンダーでタスクを作成し、Todoist側で完了したタスクががスプレッドシートで一覧で表示されます。
自分の作業を定期的に可視化することで、効率化を考えたり、業務範囲を見直したりできます。

GitHubで編集を提案

Discussion