kintoneとGASを連携させる方法【API連携入門】

kintoneに蓄積したデータをGASで自動処理する仕組みを、APIキーの取得から実装まで最短ステップで解説します。

kintoneはサイボウズが提供するノーコード業務アプリプラットフォームです。カスタマイズ性が高く、多くの中小企業で顧客管理・案件管理・日報管理などに活用されています。しかし「kintoneのデータをスプレッドシートで分析したい」「kintoneに登録があったらSlackに通知したい」といったニーズに対応するには、外部ツールとの連携が必要になります。

そこで登場するのがGoogle Apps Script(GAS)です。GASはGoogleのサーバーで動作する無料のスクリプト環境で、kintone REST APIを呼び出すことができます。本記事ではkintoneとGASを連携させる基本手順を、初心者でも再現できるようにコード例つきで紹介します。

この記事でできること

  • kintone REST APIの基本的な仕組みを理解する
  • GASからkintoneのレコードを取得してスプレッドシートに書き出す
  • GASからkintoneにレコードを新規登録する
  • kintoneのWebhookとGASを組み合わせてリアルタイム通知を実現する

事前準備

作業を始める前に以下を用意しておいてください。

  • kintoneの環境: サブドメイン(例: yourcompany.cybozu.com)とログイン情報
  • APIトークンの発行: kintoneアプリの設定画面 →「APIトークン」→「生成」でトークンを作成します。レコードの取得には「レコード閲覧」、登録には「レコード追加」の権限が必要です
  • アプリIDの確認: kintoneアプリのURLに含まれる数字(例: /k/123/ なら123がアプリID)
  • Googleアカウント: スプレッドシートとGASを利用するために必要

STEP1: GASプロジェクトを作成する

Googleスプレッドシートを新規作成し、メニューから「拡張機能」→「Apps Script」を開きます。エディタが表示されたら、デフォルトの myFunction を削除して、以下のコードを貼り付ける準備をします。

まず、kintoneの接続情報をスクリプトプロパティに保存しておくと安全です。エディタ左側の「プロジェクトの設定」→「スクリプト プロパティ」に以下を登録してください。

  • KINTONE_SUBDOMAIN: yourcompany(.cybozu.com の前の部分)
  • KINTONE_APP_ID: 123(アプリID)
  • KINTONE_API_TOKEN: 発行したAPIトークン文字列

STEP2: kintoneからレコードを取得してスプレッドシートに書き出す

以下のコードをGASエディタに貼り付けます。kintone REST APIの records エンドポイントにGETリクエストを送り、取得したデータをスプレッドシートに書き出します。フィールドコード一覧をヘッダー行として出力し、各レコードの値を行として追記します。

function fetchKintoneRecords() {
  const props = PropertiesService.getScriptProperties();
  const subdomain = props.getProperty('KINTONE_SUBDOMAIN');
  const appId = props.getProperty('KINTONE_APP_ID');
  const apiToken = props.getProperty('KINTONE_API_TOKEN');

  const baseUrl = 'https://' + subdomain + '.cybozu.com/k/v1/records.json';
  const query = 'app=' + appId + '&query=limit 100';
  const url = baseUrl + '?' + query;

  const options = {
    method: 'GET',
    headers: {
      'X-Cybozu-API-Token': apiToken,
      'Content-Type': 'application/json'
    },
    muteHttpExceptions: true
  };

  const response = UrlFetchApp.fetch(url, options);
  const data = JSON.parse(response.getContentText());

  if (!data.records || data.records.length === 0) {
    Logger.log('レコードが見つかりません');
    return;
  }

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.clearContents();

  const firstRecord = data.records[0];
  const fieldCodes = Object.keys(firstRecord);
  sheet.appendRow(fieldCodes);

  data.records.forEach(function(record) {
    const row = fieldCodes.map(function(code) {
      const field = record[code];
      return field ? field.value : '';
    });
    sheet.appendRow(row);
  });

  Logger.log(data.records.length + '件のレコードを書き出しました');
}

コードを保存して「fetchKintoneRecords」を実行すると、kintoneのレコードがスプレッドシートに書き出されます。初回実行時はGoogleアカウントへのアクセス許可を求めるダイアログが表示されるので「許可」をクリックしてください。

STEP3: GASからkintoneにレコードを新規登録する

次は逆方向の連携です。GASからkintone REST APIの record エンドポイントにPOSTリクエストを送り、新規レコードを登録します。以下の例では「会社名」「担当者名」「メモ」の3フィールドを持つアプリを想定しています。フィールドコードは実際のアプリに合わせて変更してください。

function addKintoneRecord() {
  const props = PropertiesService.getScriptProperties();
  const subdomain = props.getProperty('KINTONE_SUBDOMAIN');
  const appId = props.getProperty('KINTONE_APP_ID');
  const apiToken = props.getProperty('KINTONE_API_TOKEN');

  const url = 'https://' + subdomain + '.cybozu.com/k/v1/record.json';

  const payload = {
    app: appId,
    record: {
      '会社名': { value: '株式会社サンプル' },
      '担当者名': { value: '田中 太郎' },
      'メモ': { value: 'GASから自動登録したレコードです' }
    }
  };

  const options = {
    method: 'POST',
    headers: {
      'X-Cybozu-API-Token': apiToken,
      'Content-Type': 'application/json'
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  const response = UrlFetchApp.fetch(url, options);
  const result = JSON.parse(response.getContentText());

  if (result.id) {
    Logger.log('レコード登録成功 ID: ' + result.id);
  } else {
    Logger.log('エラー: ' + response.getContentText());
  }
}

STEP4: kintone WebhookとGASを連携してSlack通知する

kintoneにはWebhook機能があり、レコードの追加・更新・削除のタイミングで外部URLにPOSTリクエストを送ることができます。GASのウェブアプリを受け口にすれば、kintoneの変更をリアルタイムで検知して処理できます。まずGASにWebhookを受け取る doPost 関数を実装します。

function doPost(e) {
  const body = JSON.parse(e.postData.contents);
  const record = body.record;
  const appName = body.app.name;

  const companyName = record['会社名'] ? record['会社名'].value : '(不明)';
  const message = 'kintone[' + appName + ']に新しいレコードが追加されました
会社名: ' + companyName;

  const slackUrl = PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL');

  UrlFetchApp.fetch(slackUrl, {
    method: 'POST',
    contentType: 'application/json',
    payload: JSON.stringify({ text: message })
  });

  return ContentService.createTextOutput('OK');
}

このスクリプトをウェブアプリとしてデプロイし(「デプロイ」→「新しいデプロイ」→種類:「ウェブアプリ」、アクセスできるユーザー:「全員」)、発行されたURLをkintoneのWebhook設定画面に貼り付ければ連携完了です。

STEP5: 複数レコードをまとめて更新する

kintone REST APIには複数レコードを一括更新するエンドポイント(PUTメソッド)もあります。スプレッドシートで編集した内容をkintoneに反映するといった双方向同期にも応用できます。対象レコードのIDとフィールド値の配列を指定してリクエストします。

function updateKintoneRecords() {
  const props = PropertiesService.getScriptProperties();
  const subdomain = props.getProperty('KINTONE_SUBDOMAIN');
  const appId = props.getProperty('KINTONE_APP_ID');
  const apiToken = props.getProperty('KINTONE_API_TOKEN');

  const url = 'https://' + subdomain + '.cybozu.com/k/v1/records.json';

  const records = [
    { id: '1', record: { 'ステータス': { value: '完了' } } },
    { id: '2', record: { 'ステータス': { value: '対応中' } } }
  ];

  const options = {
    method: 'PUT',
    headers: {
      'X-Cybozu-API-Token': apiToken,
      'Content-Type': 'application/json'
    },
    payload: JSON.stringify({ app: appId, records: records }),
    muteHttpExceptions: true
  };

  const response = UrlFetchApp.fetch(url, options);
  Logger.log(response.getContentText());
}

うまくいかないときのチェックリスト

  • APIトークンの権限が不足している: 取得には「レコード閲覧」、登録には「レコード追加」、更新には「レコード編集」の権限が必要です。kintone側のトークン設定を再確認してください
  • フィールドコードが間違っている: kintoneのフィールドコードは「表示名」ではなく「フィールドコード」を使います。アプリの設定画面で確認してください
  • クエリ構文のエラー: queryパラメータのkintoneクエリ構文が間違っているとエラーになります。まずは「limit 10」だけで動作確認しましょう
  • ウェブアプリのアクセス権限: Webhookを受け取るウェブアプリは「全員(匿名ユーザーを含む)」でアクセス許可しないとkintoneからのPOSTを受け取れません
  • GASの実行制限: 無料のGoogleアカウントでは1日の実行時間に上限(6時間)があります。大量データを扱う場合は分割処理を検討してください

応用・発展

kintoneとGASの連携をマスターすると、業務の幅が大きく広がります。例えば「スプレッドシートで集計した売上データを毎朝kintoneに自動登録する」「kintoneの問い合わせレコードをGASで解析してGmailで自動返信する」「kintoneとGoogleカレンダーをGASで同期して予定管理を一元化する」といった高度な自動化も実現できます。また、kintone側のプラグインやJavaScriptカスタマイズと組み合わせることで、ボタンクリックでGASを呼び出す双方向の連携も可能です。

まとめ

  • kintone REST APIはAPIトークン認証でGASから簡単に呼び出せる
  • GETでレコード取得、POSTで新規登録、PUTで更新と、HTTPメソッドで操作を使い分ける
  • APIトークンはスクリプトプロパティに保存してコードに直書きしない
  • kintoneのWebhookとGASのウェブアプリを組み合わせるとリアルタイム処理が実現できる
  • スプレッドシートとの双方向同期や外部サービス(Slack・Gmail)への通知など、GASが仲介役になって業務自動化の幅が大きく広がる

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA