GASでwebhookデータを受け取るためのダミーデータでテストする

何を実現したいのかを書きましょう

GAS(Google Apps Script)でkintoneからのwebhookを受け取ろうとすると

doPost(e){}

を使ったものになりデバッグしづらい。

通常のGAS実行ならばデバッグ機能が利用できるがwebhookを利用した場合、外部からのイベントが関わるためにデバッグするには準備することが多い。

なるべく手間がかからずkintoneからのwebhookのダミーデータで練習した上で実際のデータに移行できるように以下のサンプルを作りました。

・サンプルを呼び出すcaller_で始まる関数を指定して実行すると
console.log()にデータが出力されます。
・受け取ったデータをアクティブなスプレッドシートに書き込みます。

image

webhook送信データのサンプルは以下を参照しています。
kintoneの操作で送信されるWebhookの通知内容 | kintone ヘルプ
https://jp.cybozu.help/k/ja/id/040602.html#set_webhook_webhook_notification_2010

GAS用サンプル

function doPost(e) {
    // スプレッドシートのIDを指定
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
    // リクエストからデータを取得
    const postData = e.postData.contents;
    // 最終行を見つける
    let lastRow = sheet.getLastRow();
    // 新しい行にデータを追加
    sheet.getRange(lastRow + 1, 1).setValue(postData);

    const params = JSON.parse(e.postData.contents);

    if (params.type === "ADD_RECORD_COMMENT") {
        console.log('params:', params);
        console.log('-------');
        console.log('URL:', params.url);
        console.log('App Name:', params.app.name);
        console.log('App ID:', params.app.id);
        console.log('Comment Created At:', params.comment.createdAt);
        console.log('Comment Creator Code:', params.comment.creator.code);
        console.log('Comment Creator Name:', params.comment.creator.name);
        console.log('Comment ID:', params.comment.id);
        console.log('Comment Mentions:', params.comment.mentions);
        console.log('Comment Text:', params.comment.text);
        console.log('ID:', params.id);
        console.log('Record ID:', params.recordId);
        console.log('Type:', params.type);
    } else if (params.type === "ADD_RECORD") {
        console.log('params:', params);
        console.log('-------');
        console.log('ID:', params.id);
        console.log('Type:', params.type);
        console.log('App Name:', params.app.name);
        console.log('App ID:', params.app.id);
        console.log('Record Title:', params.recordTitle);
        console.log('レコード番号.type:', params.record["レコード番号"].type);
        console.log('レコード番号.value:', params.record["レコード番号"].value);
        console.log('$revision.type:', params.record["$revision"].type);
        console.log('$revision.value:', params.record["$revision"].value);
        console.log('$id.type:', params.record["$id"].type);
        console.log('$id.value:', params.record["$id"].value);
        console.log('URL:', params.url);
    } else if (params.type === "DELETE_RECORD") {
        console.log('params:', params);
        console.log('-------');
        console.log('App Name:', params.app.name);
        console.log('App ID:', params.app.id);
        console.log('ID:', params.id);
        console.log('Record ID:', params.recordId);
        console.log('Deleted By Code:', params.deletedBy.code);
        console.log('Deleted By Name:', params.deletedBy.name);
        console.log('Deleted At:', params.deletedAt);
        console.log('Type:', params.type);
    }
}


function caller_add_record() {
    // データを文字列として定義
    const sendData = {
        postData: {
            contents: JSON.stringify({
                "id": "01234567-0123-0123-0123-0123456789ab",
                "type": "ADD_RECORD",
                "app": {
                    "id": "1",
                    "name": "案件管理"
                },
                "record": {
                    "レコード番号": {
                        "type": "RECORD_NUMBER",
                        "value": "2"
                    },
                    "$revision": {
                        "type": "__REVISION__",
                        "value": "3"
                    },
                    "$id": {
                        "type": "__ID__",
                        "value": "2"
                    }
                },
                "recordTitle": "往訪:サイボウズ株式会社",
                "url": "https://example.cybozu.com/k/1/show#record=2"
            })
        }
    };

    doPost(sendData);
}

function caller_comment() {
    // データを文字列として定義
    const sendData = {
        postData: {
            contents: JSON.stringify({
                "app": {
                    "id": "1",
                    "name": "案件管理"
                },
                "comment": {
                    "createdAt": "2012-02-03T09:38:09Z",
                    "creator": {
                        "code": "kato",
                        "name": "加藤 美咲"
                    },
                    "id": "11",
                    "mentions": [{
                        "code": "kato",
                        "type": "USER"
                    }, {
                        "code": "org1",
                        "type": "ORGANIZATION"
                    }, {
                        "code": "group1",
                        "type": "GROUP"
                    }],
                    "text": "サイボウズ株式会社に往訪してきました。"
                },
                "id": "01234567-0123-0123-0123-0123456789ab",
                "recordId": "2",
                "type": "ADD_RECORD_COMMENT",
                "url": "https://example.cybozu.com/k/1/show#record=2&comment=11"
            })
        }
    };

    doPost(sendData);
}


function caller_delete() {
    const sendData = {
        postData: {
            contents: JSON.stringify({
                "app": {
                    "id": "1",
                    "name": "案件管理"
                },
                "id": "01234567-0123-0123-0123-0123456789ab",
                "recordId": "2",
                "deletedBy": {
                    "code": "sato",
                    "name": "佐藤 昇"
                },
                "deletedAt": "2017-07-03T09:38:09Z",
                "type": "DELETE_RECORD"
            })
        }
    };

    doPost(sendData);
}
「いいね!」 2