kintone: レコード追加 (kintone: Add New Record)
kintone アプリにレコードを1件追加します。
2020-10-15 (C) Questetra, Inc. (MIT License)
Configs
  • C1: API トークンを設定した認証設定 *
  • C2: ドメイン(xxxxx.kintone.com または xxxxx.cybozu.com) *
  • C3: ゲストスペース ID(ゲストスペース内のアプリの場合のみ)
  • C4: アプリ ID *
  • C5: レコード ID を保存する文字型データ項目
  • C6F: フィールドコード_1
  • C6V: 値_1 #{EL}
  • C7F: フィールドコード_2
  • C7V: 値_2 #{EL}
  • C8F: フィールドコード_3
  • C8V: 値_3 #{EL}
  • C9F: フィールドコード_4
  • C9V: 値_4 #{EL}
  • C10F: フィールドコード_5
  • C10V: 値_5 #{EL}
  • C11F: フィールドコード_6
  • C11V: 値_6 #{EL}
  • C12F: フィールドコード_7
  • C12V: 値_7 #{EL}
Script
const FIELD_NUM = 7; // 扱えるフィールドの数

main();
function main(){
//// == 工程コンフィグ・ワークフローデータの参照 / Config & Data Retrieving ==
const auth = configs.get("conf_auth");
const domain = configs.get("conf_domain");
const guestSpaceId = configs.get("conf_guestSpaceId");
const appId = configs.get("conf_appId");
const recordIdDef = configs.getObject("conf_recordId");
const apiToken = httpClient.getOAuth2Token( auth );
const recordObj = retrieveRecordContent();

//// == 演算 / Calculating ==
const apiUri = determineApiUri( domain, guestSpaceId );
const recordId = addRecord( apiUri, apiToken, appId, recordObj );

//// == ワークフローデータへの代入 / Data Updating ==
setData( recordIdDef, recordId );
}

/**
* configからレコード情報(フィールドコードとフィールドの値)を読み出し、JSON オブジェクトを返す
* @return {Object} recordObj レコード情報の JSON オブジェクト
*/
function retrieveRecordContent() {
const recordObj = {};
for (let i = 0; i < FIELD_NUM; i++) {
const fieldCodeConfigName = `conf_fieldCode${i+1}`;
const fieldValueConfigName = `conf_fieldValue${i+1}`;

const fieldCode = configs.get( fieldCodeConfigName );
if ( fieldCode === "" || fieldCode === null ) { // フィールドコードが空
continue;
}
if ( recordObj[fieldCode] !== undefined ) { // フィールドコードの指定が重複
throw "The same Field Code is set multiple times.";
}

let fieldValue = configs.get( fieldValueConfigName );
if ( fieldValue === "" || fieldValue === null ) { // 値が空
fieldValue = null;
}
recordObj[fieldCode] = {
"value": fieldValue
};
}
return recordObj;
}

/**
* kintone REST API のレコード追加の URI を決定する
* ドメインが空、または kintone のドメインとして不正な文字列であればエラーとする
* ゲストスペース ID が不正な文字列であればエラーとする
* @param {String} domain ドメイン
* @param {String} guestSpaceId ゲストスペース ID
* @return {String} apiUri API の URI
*/
function determineApiUri( domain, guestSpaceId ) {
if ( domain === "" || domain === null ) {
throw "Domain is empty.";
}
const domainReg = new RegExp( '^[0-9a-zA-Z-]{3,32}.(?:kintone.com|cybozu.com)$' );
if ( !domainReg.test(domain) ) {
throw "Invalid Kintone domain.";
}
let apiUri = "";
if ( guestSpaceId === "" || guestSpaceId === null ) {
apiUri = `https://${domain}/k/v1/record.json`;
} else {
if ( !isValidId(guestSpaceId) ) {
throw "Invalid Guest Space ID.";
}
apiUri = `https://${domain}/k/guest/${guestSpaceId}/v1/record.json`;
}
return apiUri;
}

/**
* kintone REST API にレコード追加の POST リクエストを送信する
* アプリ ID が空、または不正な文字列であればエラーとする
* @param {String} apiUri API の URI
* @param {String} apiToken API トークン
* @param {String} appId アプリ ID
* @param {Object} recordObj レコード情報の JSON オブジェクト
* @return {String} recordId レコード ID
*/
function addRecord( apiUri, apiToken, appId, recordObj ) {
if ( appId === "" || appId === null ) {
throw "App ID is empty.";
}
if ( !isValidId(appId) ) {
throw "Invalid App ID.";
}
const body = {
"app": appId,
"record": recordObj
};
engine.log(`API URI: ${apiUri}`);
engine.log(`Request Body: ${JSON.stringify(body)}`);
const response = httpClient.begin()
.header( "X-Cybozu-API-Token", apiToken )
.body(JSON.stringify(body), "application/json; charset=UTF-8")
.post( apiUri );
//when error thrown
const responseJson = response.getResponseAsString();
const status = response.getStatusCode();
const accessLog = `---POST request--- ${status}\n${responseJson}\n`;
engine.log(accessLog);
if (status >= 300) {
throw `Failed to add record. status: ${status}`;
}
const json = JSON.parse(responseJson);
return json.id;
}

/**
* ID が有効か(自然数か)を判定する
* @param {String} idString ID の文字列
* @return {Boolean} 有効な ID かどうか
*/
function isValidId( idString ) {
const idReg = new RegExp( '^[1-9][0-9]*$' );
return idReg.test( idString );
}

/**
* データ項目に出力する
* @param {ProcessDataDefinitionView} dataDef データ項目の ProcessDataDefinitionView
* @param {String} dataString 出力する文字列
*/
function setData( dataDef, dataString ){
if(dataDef !== null){
engine.setData( dataDef, dataString );
}
}

Download

Capture

Notes

  1. API トークンを取得するには、アプリの設定画面の「設定(App Settings)」のタブを開き、「API トークン(API Token)」へと進みます。

    「生成する(Generate)」をクリックし、権限(Permissions)を選択(「レコード追加(Add records)」権限が必要です)したあと、「保存(Save)」をクリックします。

    「アプリを更新(Update App)」をクリックして変更を適用するのも忘れないようにしてください。
  2. ゲストスペース ID(アプリがゲストスペースにある場合)とアプリ ID は、API トークンの設定画面で確認することができます。
  3. このアドオンがサポートするフィールド型は、文字列(1行)数値文字列(複数行)リッチエディターラジオボタンドロップダウンリンク日付時刻日時です。作成日時更新日時に値を登録するには、「アプリ管理(Manage app)」権限が必要です。
  4. 値はフィールド型に一致するデータ形式で入力する必要があります。例えば日時型のフィールドであれば、2015-03-17T10:20:00Z のように入力します。詳細は kintone のリファレンスを参照してください。
%d人のブロガーが「いいね」をつけました。