📝

google app script から kintone のレコードを追加

2025/01/19に公開

kintoneのデータを、クエリを使って1件追加するスクリプトです。

はじめに

以下の環境で動作しています。

  • google app script … Chrome V8ランタイム利用
  • kintone … クラウド最新版(2025年1月時点)

用意するもの

取得するスクリプトと同じく、google app script → プロジェクトの設定 → スクリプトプロパティ に、以下3つのプロパティを作成します。
それぞれ取得元のアプリにあわせてください。
なお追加先のフィールドコードに「ルックアップ」フィールドがあるか否かでappTokenの記載方法が異なります。

プロパティ名 値(例) 備考
subdomain myDomain アドレス欄https://domainName.cybozu.comにあるdomainName部分
appId 123 レコード追加先のアプリID
appToken ABCDEFG1234567 取得対象アプリで作成したAPIトークン。
「レコード追加」の権限が必要。「レコード閲覧」権限は不要です。
appToken (例外) ABCDEFG1234567,HIJKLMN8901234 追加するデータに フィールドタイプ:ルックアップ を含む場合は、ルックアップ先アプリの「レコード閲覧」権限があるAPIトークンが必要です。APIトークン同士は","で区切ります。

追加先アプリ

以下アプリ(例)に追加します。

フィールド名 フィールドコード フィールド形式 追加したい値
ユーザー名 userName 文字列(1行) 山田太郎
ユーザーID userID 数値 12345
メールアドレス mailAddress リンク sample_mail@gmail.com
生年月日 birthday 日付 2000/01/01

スクリプト

addRecord.js
/**
 * サンプルスクリプト
 */
function sampleScript() {
  const birthdayValue = new Date(2000, 1, 1, 0, 0, 0);
  const addData = {
    userName: {
      value: '山田太郎'
    },
    userID: {
      value: '12345'
    },
    mailAddress: {
      value: 'sample_mail@gmail.com'
    },
    birthday: {
      value: Utilities.formatDate(birthdayValue, 'JST', 'yyyy-MM-dd') //'2000-01-01'とハードコーディングしてもOK!
    },
  }
  const resp = addRecord(addData)
  Logger.log(resp)
}

/**
 * スクリプトプロパティに設定したアプリにレコードを1件追加
 */
function addRecord(recordData) {
  const subDomain = scriptProperties.getProperty('subdomain')
  const appId = Number(scriptProperties.getProperty('appId'))
  const appToken = scriptProperties.getProperty('appToken')
 
  const url = `https://${subDomain}.cybozu.com/k/v1/record.json`;
  const options = {
    method: 'POST',
    headers: {
      'X-Cybozu-API-Token': appToken,
      'Content-Type': 'application/json',
    },
    muteHttpExceptions: true,
    payload: JSON.stringify({
      app: appId,
      record: recordData,
    }),
  };

  try {
    const resp = UrlFetchApp.fetch(url, options);
    if (resp.getResponseCode()!==200) {
      throw new Error(`レコード追加エラー:\n HTTPステータス:${resp.getResponseCode()}\n レスポンス :${resp.toString()}`);
    }
    return JSON.parse(resp.getContentText());
  } catch (error) {
    throw new Error(error.message);
  }
}

説明

追加するレコードデータを準備

part of addRecord.js
  const birthdayValue = new Date(2000, 1, 1, 0, 0, 0);
  const addData = {
    userName: {
      value: '山田太郎'
    },
    userID: {
      value: '12345'
    },
    mailAddress: {
      value: 'sample_mail@gmail.com'
    },
    birthday: {
      value: Utilities.formatDate(birthdayValue, 'JST', 'yyyy-MM-dd') //'2000-01-01'とハードコーディングしてもOK!
    },
  }

登録の際は、対象アプリがどんなフィールド形式かまでを念頭においてレコードデータを作成しなければなりません。フィールド形式ごとにどんな書き方をすれば良いのか?は こちらの公式ページ が参考になります。
※特にサブテーブルはネストで深くなりますのでカッコの使い方に注意が必要です。

生年月日birthday項目に追加するデータは書式がyyyy-MM-ddになっていれば良いので自由にコーディングできますが、せっかくGAS標準のUtilities関数があるのでそれを利用しています。

スクリプトプロパティから秘匿した設定を取得

part of addRecord.js
  const subDomain = scriptProperties.getProperty('subdomain')
  const appId = Number(scriptProperties.getProperty('appId'))
  const appToken = scriptProperties.getProperty('appToken')

コピペしづらい&セキュリティ上よろしくないので各設定値はハードコーディングせず、スクリプトプロパティに格納しておき、その内容を取得します。
これで、addRecord()を別のGASスクリプトから利用したいとなった場合も安全に処理できます。getRecord()gerRecords()と同じですね。


パラメータ・リクエストヘッダ・リクエストボディの作成

part of addRecord.js
  const url = `https://${subDomain}.cybozu.com/k/v1/record.json`;
  const options = {
    method: 'POST',
    headers: {
      'X-Cybozu-API-Token': appToken,
      'Content-Type': 'application/json',
    },
    muteHttpExceptions: true,
    payload: JSON.stringify({
      app: appId,
      record: recordData,
    }),
  };

payload: {}ではじめてbody部分の内容を扱います。
ここはJSON.stringify()を使いHTTPリクエストとして正しい形式になるように調整しておきます。これがないだけでエラーばかりが返ってくるので、勉強していた当初はかなり悩みました。
APIトークンによる認証方式を使った場合の注意点はレコード取得の場合と同じです。
https://zenn.dev/nori_suke/articles/6cbd7e1cb886e6#パラメータ・リクエストヘッダの作成

なおpayload: {}の内容にあたる追加したいレコードの書式(お作法)は
https://cybozu.dev/ja/kintone/docs/overview/field-types/
を参照してください。作成イメージは
https://cybozu.dev/ja/id/e7f3125797f78aaec154b918/#request
の「ボディ」項が参考になります。


リクエストする

part of addRecord.js
  try {
    const resp = UrlFetchApp.fetch(url, options);
    if (resp.getResponseCode()!==200) {
      throw new Error(`レコード追加エラー:\n HTTPステータス:${resp.getResponseCode()}\n レスポンス :${resp.toString()}`);
    }
    return JSON.parse(resp.getContentText());
  } catch (error) {
    throw new Error(error.message);
  }

上の「パラメータ・リクエストヘッダ・リクエストボディの作成」が肝になるのでここは他記事と同じですが、GASスクリプト標準のHTTPリクエストUrlFetchApp.fetchを使って外部(kintone)にHTTPリクエストします。
レスポンスコードが200以外はエラーになるので、その場合にはエラーをthrowするようにしています。

Discussion