モブズテック

ITの情報を発信します(*ˊᵕˋ*)ノ

【kintone】アプリに登録したレコードをスプレッドシートに転記してバックアップしてみた

やりたいこと

kintoneのレコードを定期的にバックアップしておきたい。
CSV出力となると手間がかかるため、GASを使ってスプレッドシートへ転記することでバックアップする。

スプレッドシート

5行目以降にkintoneアプリのレコードをGASで転記する。

GAS

// kintoneのアプリのレコードをスプレッドシートへバックアップする
function backupRecord() {

  // スプレッドシートの全シートの取得
  const sheets = SpreadsheetApp.openById([スプレッドシートのID]).getSheets();、
  // ▲https://docs.google.com/spreadsheets/d/[ここの部分]/edit#gid=0

  for (const sheet of sheets) {

    // アプリ定義
    // ▼アプリIDなどのアプリによって変わる値は、スプレッドシートに書いておく
    const appId = sheet.getRange(1, 5).getValue();
    const apiToken = sheet.getRange(2, 5).getValue();
    const query = sheet.getRange(3, 5).getValue();
    // ▲例:"Where ~~ Order by ~~"

    // バックアップ日の設定
    sheet.getRange(1, 2).setValue(Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy年MM月dd日 HH:mm:ss'));
    // ▲スプレッドシートにバックアップ日を設定しておくと、いつバックアップしたものか分かる

    // 項目名の取得
    let fields = [];
    let col = 1;
    while (sheet.getRange(4, col).getValue()) {
    // ▲スプレッドシートのフィールド名をアプリのフィールド名と同じにしておく
      fields.push(sheet.getRange(4, col).getValue());
      col += 1;
    }

    // APIパラメータの設定
    const url = "https://[サブドメイン].cybozu.com/k/v1/records.json" +
                "?app=" + appId +
                "&fields=" + encodeURIComponent(fields.join(",")) +
                // ▲配列で格納したフィールド名を文字列としてカンマ区切りで結合して設定
                "&query=" + encodeURIComponent(query);

    try {
      // APIの実行
      let res = JSON.parse(UrlFetchApp.fetch(url, {"method": "GET","headers": {"X-Cybozu-API-Token": apiToken}}));

      // シートを一度クリア
      sheet.getRange(5, 1, 1000, fields.length);
      // ▲仮で300行(レコード)分、クリアしている(レコードが多いアプリがある場合はもっと大きい値にする)

      // レコード内容の設定
      let row = 5;
      res["records"].forEach((record) => {
        for (let j = 0; j < fields.length; j++) {
        // ▲スプレッドシートに記載したフィールド数分繰り返して、kintoneの値をスプレッドシートにコピーする
          sheet.getRange(row, j + 1).setValue(record[fields[j]].value);
        }
        row += 1;
      });

    } catch(error) {
      console.error(error.stack);
    }
  }
}