【チャットワーク】タスクをgoogleカレンダーに自動連携する(Google Apps Script)

2017/12/2更新 コードを修正しました!

できること

チャットワークのタスクをGoogleカレンダーに自動連携します。
具体的には、期限が設定され未完了の自分のタスクを、Googleカレンダーに予定として自動で登録します。

チャットワークのタスクとGoogleカレンダーを同期してほしいという要望があったので、APIとGoogle Apps Scriptを使って作成してみました。Googleカレンダー側の通知機能を使うことでアラート(リマインド)することもできます。

わかりやすく説明したつもりなので、ぜひお試しください。

チャットワークAPIトークンを取得

チャットワークAPIの利用申請し、APIトークンを取得してください。
トークンの取得方法はこちら→ http://developer.chatwork.com/ja/authenticate.html

新しいカレンダーを作る

専用のカレンダーを作成します。
Googleカレンダーを開き、マイカレンダー横の「▼」から「新しいカレンダーの作成」をクリック。

カレンダー名に適当に名前をつけて「カレンダーボタンを作成」をクリック。

カレンダーのIDを調べる

作成したカレンダーの「カレンダー設定」を開きます。

少し下にスクロールし、「カレンダーのアドレス」項目にカレンダーIDが表示されます。
このIDは後ほど使用します。

GoogleドライブでGoogleAppsScriptを作成する

Googleドライブを開き、「新規」ボタンから「Google Apps Script」をクリックします。

※「Google Apps Script」が出てこない場合は、「アプリを追加」から「Google Apps Script」を検索して、接続をクリックしてください。

無題のプロジェクトが開きます。
(最初に入っている「function myFunction() …」のコードは消しちゃってください。)

 

下のコードをまるっとコピペする

下のコードをすべてコピーし、作成したプロジェクトのコード入力欄に貼り付けます。

/*---- 初期設定ここから----*/

// チャットワークAPIトークンを設定
 var ChatWorkToken = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

// googleカレンダーIDを設定 ※専用のカレンダーを作成することをオススメします
var CALENDAR_ID = 'xxxxxxxxxxxxxxxxxxxxxxxxxx@group.calendar.google.com';

/*---- 初期設定ここまで ----*/


// 識別キー
var SIGNATURE = "fromChatWork";

/*---- メインFunction ----*/

function myFunction(){
  
  // 最初にすべての予定をクリアする
  clearAllEvents();
  
  // ChatWork apiに投げるパラメータを設定
  var params = {
    headers : {"X-ChatWorkToken" : ChatWorkToken},
    method : "get"
  };
  
  //未完了のタスクを取得するURL
  var url = "https://api.chatwork.com/v2/my/tasks?status=open";

  //チャットワークAPIエンドポイントからレスポンスを取得
  var strRespons = UrlFetchApp.fetch(url, params);

  //レスポンスがない場合は終了
  if(strRespons == "") return false;

  //レスポンス文字列をJSON形式として解析しJSONオブジェクトとして返す
  var json = JSON.parse(strRespons.getContentText());

  Logger.log( "未完了タスク数: " + json.length );
  
  // googleカレンダーオブジェクト作成
  var calendar = CalendarApp.getCalendarById(CALENDAR_ID);
  
  // タスク毎に予定を作成
  for each(var obj in json){

    // タイトルを設定
    var title = obj.body;
    title = title.split(String.fromCharCode(10)).join(' '); // 改行をスペースに置換
    title = title.replace(/\[/g, "<"); // chatworkのタグを "[" → "<" に変換
    title = title.replace(/\]/g, ">"); // chatworkのタグを "]" → ">" に変換
    title = title.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g, ""); // タグを削除
    title = title.substring(0,50); // タイトルは50文字で切る
    
    // 期限のないタスクの場合はログを残してスキップ
    if( obj.limit_time == 0 ){
      Logger.log( "期限なし: " + title );
      continue;
    }
    // UNIXTIMEを変換してdateにセット
    var date = new Date( obj.limit_time * 1000 ); 
    
    // 説明欄を設定
    var description = obj.body;
    description += String.fromCharCode(10) + "------------------------------";
    description += String.fromCharCode(10) + obj.room.name; // ルーム名
    description += String.fromCharCode(10) + "https://www.chatwork.com/#!rid" + obj.room.room_id; // ルームURL
    description += String.fromCharCode(10) + "依頼者: " + obj.assigned_by_account.name; // 依頼者

    var options = {description: description}; 

    // 終日のイベントを作成
    var event = calendar.createAllDayEvent(title, date, options);

    // イベントにタグ付け
    event.setTag(SIGNATURE, "true");
  }

}


/*---- 前後1年間の予定をクリアするFunction ----*/

function clearAllEvents() {
  
    // googleカレンダーオブジェクト作成
    var calendar = CalendarApp.getCalendarById(CALENDAR_ID);
  
    // 今日の日付取得
    var date = new Date();
  
    // 今日の年、月、日を格納
    var year = date.getYear();
    var month = date.getMonth();
    var day = date.getDate();
  
    // 前後1年間の予定を取得
    var events = calendar.getEvents(new Date(year - 1, month ,day), new Date(year + 1, month, day));

    // イベントの数だけ繰り返し処理
    for(var n=0; n<events.length; n++){

      // カレンダーの説明に指定の単語があれば予定を削除
      if ( events[n].getTag(SIGNATURE) == "true" ) {
        events[n].deleteEvent();
      }

    }
}

コード上部のチャットワークのトークンとカレンダーIDを書き換える

コードの上の方に、チャットワークのAPIトークンと、GoogleカレンダーのカレンダーIDを入力する箇所があるので、ご自分のトークンと、先ほど作成したカレンダーIDに書き換えてください。

/*---- 初期設定ここから----*/

// チャットワークAPIトークンを設定
 var ChatWorkToken = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

// googleカレンダーIDを設定 ※専用のカレンダーを作成することをオススメします
var CALENDAR_ID = 'xxxxxxxxxxxxxxxxxxxxxxxxxx@group.calendar.google.com';

/*---- 初期設定ここまで ----*/

保存ボタンを押して、適当なプロジェクト名をつけて保存します。

実行してみる

プルダウンメニューで「myFunction」を選択した状態で、実行ボタン(三角のボタン)をクリック。

※初回のみ実行の承認と許可を求められるので「許可」ボタンを押してください。

処理が完了すると、カレンダーに予定が登録されます。

トリガーを設定する

トリガーを設定することで、自動で最新のタスクをカレンダーに反映できます。

まず、(時計みたいな)トリガーボタンをクリックして、トリガーを追加します。

「myFunction」、「時間主導型」、「時タイマー」、「1時間ごと」を選択して保存。

これで1時間に1度、自動的にカレンダーを更新するよう設定できました。

まとめ

以上が、チャットワークの未完了タスクをGoogleカレンダーに自動連携する方法でした。
カレンダーの設定を変更することで、◯日前の◯時に通知するという設定もできます。

更新時には、カレンダー内のすべての予定をチェックして削除し、新しく予定(タスク)を登録しなおしてます。
なので、カレンダーに予定がたくさん入っていたり、未完了タスクが多かったりすると処理が間に合わなくなることがあります。
もし不具合などあれば教えてください。

4 件のコメント

  • 有難うございます、参考にさせて頂きました。

    折角の有用な記事ですが、コピペだとうまく動かないようです。

    ・期限の無いタスクの処理ですが、breakではなく continue ですね。
    ・chatworkの] タグ変換の変換処理ですが、前の行から改行されていなくコメントアウトされてます。

    では、有難うございました。

    • まさるさん

      ご指摘ありがとうございます!
      凡ミス失礼しました。。修正して更新いたしました^^

  • 「短時間に作成したカレンダーまたはカレンダーの予定の数が多すぎます。しばらくしてからもう一度お試しください。」
    このようなエラー表示が出るんですが、放置しておいても時間が経過すれば、連携が始まってGoogleカレンダーにタスクが立つんでしょうか?

    • HEROさん

      コメントありがとうございます!
      純粋にタスクの数が多いか、コードにバグがあるか、のどちらかだと思いますが、
      どれくらい未完了タスクが登録されてますでしょうか。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です