google app script から kintone のレコードを追加
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 |
スクリプト
/**
* サンプルスクリプト
*/
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);
}
}
説明
追加するレコードデータを準備
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
関数があるのでそれを利用しています。
スクリプトプロパティから秘匿した設定を取得
const subDomain = scriptProperties.getProperty('subdomain')
const appId = Number(scriptProperties.getProperty('appId'))
const appToken = scriptProperties.getProperty('appToken')
コピペしづらい&セキュリティ上よろしくないので各設定値はハードコーディングせず、スクリプトプロパティに格納しておき、その内容を取得します。
これで、addRecord()
を別のGASスクリプトから利用したいとなった場合も安全に処理できます。getRecord()
、gerRecords()
と同じですね。
パラメータ・リクエストヘッダ・リクエストボディの作成
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トークンによる認証方式を使った場合の注意点はレコード取得の場合と同じです。
なおpayload: {}
の内容にあたる追加したいレコードの書式(お作法)は
を参照してください。作成イメージは
の「ボディ」項が参考になります。
リクエストする
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