IFTTT+Google Apps Script でカレンダーの予定を「いい感じ」にToodledoにタスク追加する

Pocket

ifttt

随分以前にご紹介した、 IFTTTToodledo を連携させてタスク登録などを自動化するTips。

IFTTT に Toodledo Channel も追加され、より簡単にレシピを作ったり、自動化を試せるようになりました。

が、上記で用意された公式の「Actions」は何か物足りない…。

今回、IFTTT と Google Apps Script を組み合わせて「カレンダーに登録した予定」を「期日、所要時間」などの情報をセットして「Toodledoの新規タスク」として自動登録する方法をご紹介します。

やりたいことの確認

今回は、カレンダー(Googleカレンダー)に作成した予定・イベントをToodledoに新規タスクとして追加します。

その際、タスク名(イベント名)と共に、

  • 期日(Due Date)
  • 締切時刻(Due Time)
  • 所要時間(Length)
  • 優先度(Priority)
  • タグ(Tag)

などの情報をタスクの属性として設定できるようにします。

Toodledoで一日の各タスク所要時間の合計を見積もる際、カレンダーに登録された会議などを、その特定の期日に実行予定のタスクとして表示し、かつ所要時間(会議時間など)を設定しておきたい場合があります。
EndTime2 を利用している場合など。)

上記が自動化できれば、カレンダーへの予定登録だけでToodledoへのタスク登録と期日・所要時間などの設定もおこなわれるため、カレンダーの予定を元にタスク登録するという手間が省けるハズです。

必要なもの

まずは、以下サービスそれぞれのアカウントをご用意ください。

  • Toodledoのアカウント(無料・有料 いずれもOK)
  • IFTTTのアカウント(無料で取得できます)
  • Googleのアカウント
    (Gmail、Googleカレンダー、Google Apps Script で使います)

それぞれのアカウントでちょっぴり設定が必要です。

以下、順にご説明いたします。

1.Toodledoの「メール送信でタスク登録する設定」を有効にする

Toodledoへのログイン後「Email Access」にアクセスして、
“Enable e-mail importing” にチェックを入れて有効にしておきましょう。

その際、
Send Tasks To: xxxxx.999999@toodledo.com
のようなメールアドレスが確認できますので、控えておきましょう。
後ほど使います。

(参考)上記の機能の詳細は、以下のページでも解説してます。
Toodledoにメールでタスクを追加する方法|基本・ヘルプ|Toodledo Tips

2.IFTTTでレシピ「Googleカレンダーに予定登録 → メール送信」を有効にする

下記のレシピをそのままご利用ください。

IFTTT Recipe: Googleカレンダーに予定登録 → メール送信 connects google-calendar to email

また、
Google Calendar Channel
Email Channel
の2つのチャネルをアクティベートする必要があります。

「Email Channel」では、後述のGoogleスプレッドシートを利用するGoogleのアカウントと同じGmailのアドレスを設定しましょう。
(上記「1」のEmail Access用メールアドレスではありませんのでご注意ください。)

「Google Calendar Channel(Googleカレンダー)」
「Email Channel(Gmail)」
は別々のアカウントでも特に問題はありません。

すでにアクティブ化している場合で、Googleカレンダーのアカウントと異なるGmailアドレスの場合は、一旦「Deactivate」ボタンで無効にしてから再設定をおこなってください。
なお、レシピをご自身で作成される場合は、メールの「Subject」「Body」に以下の情報が入るようにカスタマイズすればOKです。

Subject(タスク名) : {{Title}}
Body(タスクの属性) : Starts: {{Starts}}<br><br>
Ends: {{Ends}}<br><br> {{EventUrl}}

(参考)IFTTT って何?という場合はこちらの記事等が分かりやすく、参考になります。 作りながら覚える「IFTTT」レシピの使い方活用講座!(全5回) | hoomey

3.Google スプレッドシートに「Google Apps Script」を登録する

まず、Googleドライブ経由か、Google スプレッドシート に直接アクセスして、右下の「新しいスプレッドシートを作成」等をクリックし、新しいシートを作成します。
(シート名は”無題スプレッドシート”等で構いません。)

https://docs.google.com/spreadsheets/

次に、上記「1」で確認した「Email Access」のメールアドレスを、作成したシートの一番左上(A:1のセル)に貼り付けます。
そして、このメールアドレス宛てタスク追加メールを送信するためのスクリプトを設定しますので、「ツール」→「スクリプトエディタ」をクリックしましょう。

初期状態では、右側のコード編集領域に「function myFunction()…」などのサンプルコードが表示されていますので、サンプルコードは削除し、以下のコードをすべてコピー&ペーストして、保存してください。 (保存する際、プロジェクト名の確認が出た場合は”無題のプロジェクト”等適当に名前を付けます。)

/*
 * IFTTTからの通知メール(Googleカレンダー -> Gmail)を元に
 * Toodledoへタスク登録をおこないます。
 *
 * タスク名、開始日、開始時刻、所要時間、優先度、スター
 *  by Toodledotips.jp
 */

//--------------------------------------------------------

//Toodledoのタスク登録用メールアドレス
toodledo_mail = getToodledoMailAddress();

//タスクの優先度
toodledo_priority = "!!!"; // 3 - Top
//toodledo_priority = "!!"; // 2 - High
//toodledo_priority = "!"; // 1 - Medium

//タスクのスター
toodledo_star = "*"; //スターあり
//toodledo_star = ""; //スターなし

//タスクのタグ
toodledo_tag = "予定"; // "予定"
//toodledo_tag = ""; // "" (指定しない)

//--------------------------------------------------------

function checkMailToTask() {
  if(toodledo_mail){
    var threads = GmailApp.search('is:unread from:action@ifttt.com');
    if (threads == null || threads.length === 0) return;
    for (var i = 0; i < threads.length; i++) {
      Utilities.sleep(2000);
      var msgs = threads[i].getMessages();
      for (var j = 0; j < msgs.length; j++) {
        var msg = msgs[j];
        var subject = msg.getSubject();
        var body    = msg.getPlainBody();
        if ((/action@ifttt.com/.test(msg.getFrom())) && msg.isUnread()){
          addToodledoTaskByMail(subject,body);
          msg.markRead();
          // msg.moveToArchive();
        }
      }
    }
  }
}

function getToodledoMailAddress() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var data = sheet.getDataRange();
  var rowscnt = data.getLastRow();
  var numRows = data.getNumRows();
  var rows = sheet.getRange(1, 1);
  
  if(rows.getValues() != ""){
    return rows.getValues();
  }else{
    return false;
  }
}

function addToodledoTaskByMail(subject,body){
  var EventDateTime = getEventDateTime(body);
  if(EventDateTime){
    var EventStart    = EventDateTime.start;
    var EventEnd      = EventDateTime.end;
    var mailSub = subject;
    var myStartTime = "";
    var myEndTime = "";
    if(EventStart.date){
      mailSub = mailSub + " #" + EventStart.date;
      if (EventStart.time){
        mailSub = mailSub + " =" + EventStart.time;
        if(EventStart.time.indexOf("AM") != -1){
          myStartTime = EventStart.time.replace("AM", " AM");
        }
        if(EventStart.time.indexOf("PM") != -1){
          myStartTime = EventStart.time.replace("PM", " PM");
        }
        if (EventEnd.time){
          if(EventEnd.time.indexOf("AM") != -1){
            myEndTime = EventEnd.time.replace("AM", " AM");
          }
          if(EventEnd.time.indexOf("PM") != -1){
            myEndTime = EventEnd.time.replace("PM", " PM");
          }
          var myStartDateTime =  new Date(EventStart.date + " " + myStartTime);
          var myEndDateTime   =  new Date(EventEnd.date + " " + myEndTime);
          var length = getMinDiff(myStartDateTime,myEndDateTime);
          if(length > 0){
            mailSub = mailSub + " ~" + length;
          }
        }
      }
    }
    if(toodledo_priority){
      mailSub = mailSub + " " + toodledo_priority;
    }
    if(toodledo_star){
      mailSub = mailSub + " " + toodledo_star;
    }
    if(toodledo_tag){
      mailSub = mailSub + " %" + toodledo_tag;
    }
    var url_match = body.match(/(http:\/\/email.ifttt.com\/wf\/click\?upn=[^\n]+)/);
    var ifturl = "";
    if(url_match){
      ifturl = url_match[1];
    }
    if(toodledo_mail){
      MailApp.sendEmail(
        toodledo_mail,
        mailSub,
        ifturl
      );
    }
  }
}

function getEventDateTime(str){
  if(str){
    var StartEnd_match = str.match(/Starts:([\s\S]+)Ends:/);
    if(StartEnd_match){
      var stt_match = str.match(/Starts: ([^<]+)/);
      var end_match = str.match(/Ends: ([^<]+)/);
      if(StartEnd_match[1].indexOf(" at ") != -1){
        var start = {date : stt_match[1].split(" at ")[0] , time : stt_match[1].split(" at ")[1]};
        var end   = {date : end_match[1].split(" at ")[0] , time : end_match[1].split(" at ")[1]};
      }else{
        var start = {date : stt_match[1]};
        var end   = {date : end_match[1]};
      }
    }
    return {start : start ,end : end}; 
  }else{
    return false; 
  }
}

function getMinDiff(start,end) {
    var diff = end - start;
    var diffMin = diff / 60000;
    return diffMin;
}

こちらにもテキストファイルで保存していますので利用してください。
http://toodledotips.jp/tool/code.gs_jp.txt

スクリプトを保存後、Gmailの受信トレイチェック&送信を有効にするため "承認(authorization)" 作業をおこないます。

関数の一覧から、一番上の checkMailToTask を選択して、実行ボタンをクリックします。

承認の確認ダイアログが表示されたら 続行 をクリックして

念のためGmailアカウントが間違いないか確認して、さらに 承認する をクリックしましょう。

最後に定期的に実行されるようにトリガーを設定します。

スクリプトエディタの画面からメニュー 「リソース」→「現在のプロジェクトのトリガー」 をクリックします。

トリガーが未設定の場合は「トリガーが設定されていません…」と表示されるので、このリンクをクリックします。

実行の項目は checkMailToTask 、イベントの項目は 時間主導型 - 分タイマー - 15分ごと と選んで、保存をクリックしましょう。

設定は以上で終了です。

(Googleスプレッドシートはそのまま閉じてしまってOKです。ただし間違って消してしまわないように残しておいてください。)

あとは、下記の通りGoogleカレンダーに作成された予定が、一旦Gmailに送信され、Google Apps Scriptによって、Toodledoにメール経由でタスク登録されるようになります。
(カレンダーに予定登録後、通常は15分~30分程度でタスク登録されます。)

(参考)Google Apps Script って何?という場合はこちらの記事等が分かりやすく、参考になります。

作業効率化!Googleアプリを1000%活かせる「Google Apps Script」の始め方 | 株式会社LIG

GoogleカレンダーからToodledoへのタスク追加だけで十分…(属性は不要)という場合は

すでに Toodledo ChannelToodledo の IFTTT ページ に、公開されているレシピがあるのでこれを利用しましょう。
Add all new calendar events to your to-do list

以上、いつもながらの需要無視でご紹介しました。 このTipsでToodledoを一層活用いただけると幸いです。

P.S. この記事は当方が本家のフォーラムに投稿したTopicに一部加筆してアップしました。

Pocket