チャットワークから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分単位で実行する

- サンプル

    | 名前 | チャットワークID |メールアドレス|
    |-----|-----------|-----------|
    |AAA|To:1956584|hoge1@gmail.com|
    |BBB|To:1956582|hoge2@gmail.com|

# ソースコード

```php
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
        }
    );
}
```

# 参考
- チャットワークAPI
    - http://developer.chatwork.com/ja/
- Apps Script
    - https://www.google.com/script/start/
- GASでSpreadsheetを操作する自分的ベストプラクティス
    - https://qiita.com/ryan5500/items/e72eb205fbe006c2eb6f
- 【保存版】Google Apps Scriptリファレンス～キーワード別インデックス
    - https://tonari-it.com/google-apps-script-reference/
- Google Apps Script リファレンス
    - https://developers.google.com/apps-script/reference/calendar/