前回公開したスクリプト(スプレッドシート ⇒ Kintoneへの自動同期)とは反対に、続いてはGAS(Google Apps Script)を使用したKintone ⇒ スプレッドシートへの自動同期の方法です。

こちらも前回同様に、Kintoneを運用されている企業や個人の場合、KintoneからGoogleスプレッドシートに定期的にデータを同期したいというシーンが割りかし多い印象です。

そのようなご依頼を頂戴する場合は、下記のようなコードを使用しています。

Web上に同様なコードはたくさん転がっていますが、私が作成したサンプルコードの主な仕様は以下の通りです。

<利点>

・スプレッドシートに同期したいKintoneフィールドの指定が管理しやすい
・10,000件までしか取得できないoffsetを利用した記述ではなく、ID昇順をベースとしたシーク法での記述(10,000件以上も取得可能)
・処理が高速(約10,000件の取得に1分弱)

<サンプルコードの仕様>

・取得するフィールドコード名を一行目に見出しとして使用
・処理毎にシートをクリアする(取得レコード数が減少した場合に前回のレコードが残らないようにするため)

500件の取得でAPIを1回消費しますが、10,000件の取得でも約20回(基本1~2回増えます)なので、1日1~2回の自動同期であれば、Kintoneの1アプリ当たりのAPI上限数(10,000回/日)を気にする必要はありません(もちろん、ご利用の状況には依ります)。

サンプルコードをカスタマイズすればかなり便利にご利用いただけるかと思いますので、ぜひ、ご自由にお使いください!

※ご質問にはお答えできませんので予めご承知おきくださいませ。

コード

const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート名");

const kDomain = "kintoneのドメイン";
const kUrls = `https://${kDomain}.cybozu.com/k/v1/records.json`;

const apiToken = "対象アプリのAPIトークン";
const appId = "対象アプリのID";

function importRecords() {
  // 取得前にシートをクリア
  sheet.clear();

  // kintoneから取得するデータのフィールドコード
  const fields = ["更新日時", "レコード番号", "氏名", "メールアドレス"];

  // スプレッドシートに出力するデータ
  let output = [];

  // 1行目に見出しを挿入
  output.unshift(fields);

  const paramFields = "&fields=$id," + encodeURIComponent(fields.join(","));
  let url = kUrls + "?app=" + appId + paramFields;

  let hasNext = true;
  let id = 0;

  while (hasNext) {
    const res = JSON.parse(
      UrlFetchApp.fetch(
        url + "&query=" + encodeURIComponent("$id > " + id + " order by $id asc limit 500"),
        { method: "get", headers: { "X-Cybozu-API-Token": apiToken } }
      )
    );

    if (res.records.length > 0) {
      res["records"].forEach(function (record) {
        let row = [];

        row.push(Utilities.formatDate(new Date(record["更新日時"].value), "JST", "yyyy/MM/dd HH:mm"));
        row.push(record["レコード番号"].value);
        row.push(record["氏名"].value);
        row.push(record["メールアドレス"].value);

        output.push(row);
      });

      id = res.records[res.records.length - 1].$id.value;
    } else {
      hasNext = false;
    }
  }

  // スプレッドシートに出力
  sheet.getRange(1, 1, output.length, output[0].length).setValues(output);
}

トリガー設定

トリガーは「時間手動型」から「時間ベース」や「日付ベース」で定期実行されるように設定してください。