チャットワークからGoogleカレンダーの登録を行う


前提

会議などの連絡はチャットだけじゃなくてカレンダーにも登録しておいてほしいと言われたことありませんか。
またはその逆。その他にはカレンダーを登録する時、登録する人のメールアドレスを毎回検索するのも面倒ですよね。

できること

チャットワークで以下のテンプレートに沿った発言を行うと、その発言をトリガーとしてカレンダー登録を行います。

[info][title]今月末の予算について[/title]■参加予定メンバー
[To:1956584] AAA[To:1956582] BBB

■日時
2017/9/26 10:00 ~ 10:30

■場所
ほげほげ

■備考
http://www.hogehogeeeeeeeeeeeeeeeeeeeeee.co.jp
[/info]

準備

  1. A列に名前、B列にチャットワークID、C列にメールアドレスを記載したスプレッドシートを用意する
  2. そのスプレッドシートのシート名を「メールリスト」にする
  3. 下のソースコードを5分単位で実行する

ソースコード

function SetGoogleCalendar()
{
    // チャットワークから発言を取得するためのデータを設定
    var params = {
        headers: {
            "X-ChatWorkToken": "チャットワークのトークンID"
        },
        method: "get",
    };
    var url = "https://api.chatwork.com/v2/rooms/" + "該当の発言が行われるルームID" + "/messages";
    var response = UrlFetchApp.fetch(url, params);

    // 取得する発言がなかったら何も行わない
    if (response == "") {
        return 0;
    }

    // JSONにデータを直す
    var jsonList = JSON.parse(response.getContentText("UTF-8"));

    // チャット1件、1件ずつに分けて処理を行う
    for each(json in jsonList) {
        // チャット本文の中身を今回使う内容に合わせて分割する
        json = json["body"].replace(/\r?\n/g, "");

        json = json.replace("[info][title]", "[")
            .replace("[/title]", "]")
            .replace("■日時", "][")
            .replace("■場所", "][")
            .replace("■備考", "][")
            .replace("[/info]", "]");

        json = json.match(/\[.+?\]/g)
            .toString()
            .replace(/\[/g, "")
            .replace(/\]/g, "");

        var text = json.split(",");

        // 参加メンバーのカレンダーにもスケジュールを登録するためにスプレと連携してメールアドレスを取得する
        var menberNum = 0;
        var members = [];
        while (true) {
            if (text[1 + menberNum].match(/To:/)) {
                members.push(GetMailAddress(text[1 + menberNum]));
                menberNum++;
            } else {
                break;
            }
        }

        // カンレダーに登録するための内容に分割する
        var date = text[1 + menberNum].split("~");
        var startDay = date[0].split(" ");

        // カンレダーへチャットワークの内容を登録する
        createEvent(text[0], startDay[0], startDay[1], date[1], text[2 + menberNum], text[3 + menberNum], members);
    }
}

function GetMailAddress(userId)
{
    var url = "スプレッドシートのURL";
    var spreadsheet = SpreadsheetApp.openByUrl(url);
    var sheet = spreadsheet.getSheetByName("メールリスト");

    //シートの最終行番号、最終列番号を取得
    var startRow = 1;
    var startColumn = 1;
    var lastRow = sheet.getLastRow();
    var lastColumn = sheet.getLastColumn();

    // シートの縦横すべてを取得
    var sheetData = sheet.getSheetValues(startRow, startColumn, lastRow, lastColumn);

    for (var i = 0; i < lastRow; i++) {
        if (sheetData[i][1] == userId) {
            return sheetData[i][2];
        }
    }

    return null;
}

function createEvent(title, day, startTime, endTime, location, agenda, members)
{
    var memberList = "";
    for each(member in members){
        memberList += member + ",";
    }

    var calendar = CalendarApp.getCalendarById('カレンダー登録者のメールアドレス');
    calendar.createEvent(title,
        new Date(day + " " + startTime),
        new Date(day + " " + endTime),
        {
            description: agenda,
            location: location,
            guests: memberList
        }
    );
}

参考