kintone: レコード更新 (kintone: Update Record)
kintone アプリのレコード(1件)の内容を更新します。
Configs:共通設定
  • 工程名
  • メモ
Configs
  • C1: API トークンを設定した認証設定 *
  • C2: Basic 認証設定(kintone で設定されている場合のみ)
  • C3: ドメイン(xxxxx.kintone.com または xxxxx.cybozu.com) *
  • C4: ゲストスペース ID(ゲストスペース内のアプリの場合のみ)
  • C5: アプリ ID *
  • C6: レコード ID *
  • C7F: フィールドコード_1
  • C7V: 新しい値_1#{EL}
  • C8F: フィールドコード_2
  • C8V: 新しい値_2#{EL}
  • C9F: フィールドコード_3
  • C9V: 新しい値_3#{EL}
  • C10F: フィールドコード_4
  • C10V: 新しい値_4#{EL}
  • C11F: フィールドコード_5
  • C11V: 新しい値_5#{EL}
  • C12F: フィールドコード_6
  • C12V: 新しい値_6#{EL}
  • C13F: フィールドコード_7
  • C13V: 新しい値_7#{EL}
Script (click to open)


const FIELD_NUM = 7; // 扱えるフィールドの数

main();
function main(){
  //// == 工程コンフィグ・ワークフローデータの参照 / Config & Data Retrieving ==
  const auth = configs.get("conf_auth");
  const basic = configs.get("conf_basic");
  const domain = configs.get("conf_domain");
  const guestSpaceId = configs.get("conf_guestSpaceId");
  const appId = configs.get("conf_appId");
  const recordId = retrieveRecordId();

  const apiToken = httpClient.getOAuth2Token( auth );
  const recordObj = retrieveRecordContent();

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

/**
  * config からレコード ID を読み出す
  * @return {Stromg} recordId  レコード ID
  */
function retrieveRecordId() {
  const recordIdDef = configs.getObject( "conf_recordId" );
  let recordId = configs.get( "conf_recordId" );
  if ( recordIdDef !== null ) {
    recordId = engine.findData( recordIdDef );
  }
  return 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
    };
  }
  if ( Object.keys(recordObj).length === 0 ) { // レコード情報が空
    throw "No field to update is set.";
  }
  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 にレコード更新の PUT リクエストを送信する
  * アプリ ID、レコード ID が空、または不正な文字列であればエラーとする
  * @param {String} apiUri  API の URI
  * @param {String} apiToken  API トークン
  * @param {String} basic  Basic 認証設定
  * @param {String} appId  アプリ ID
  * @param {String} recordId  レコード ID
  * @param {Object} recordObj  レコード情報の JSON オブジェクト
  */
function updateRecord( apiUri, apiToken, basic, appId, recordId, recordObj ) {
  if ( appId === "" || appId === null ) {
    throw "App ID is empty.";
  }
  if ( !isValidId(appId) ) {
    throw "Invalid App ID.";
  }
  if ( recordId === "" || recordId === null ) {
    throw "Record ID is empty.";
  }
  if ( !isValidId(recordId) ) {
    throw "Invalid Record ID.";
  }
  const body = {
    "app": appId,
    "id": recordId,
    "record": recordObj
  };
  let request = httpClient.begin()
    .header( "X-Cybozu-API-Token", apiToken )
    .body(JSON.stringify(body), "application/json; charset=UTF-8");
  if ( basic !== "" && basic !== null ) {
    request = request.authSetting(basic);
  }
  //when error thrown
  const response = request.put( apiUri );
  const responseJson = response.getResponseAsString();
  const status = response.getStatusCode();
  if (status >= 300) {
    engine.log(`API URI: ${apiUri}`);
    engine.log(`Request Body: ${JSON.stringify(body)}`);
    const accessLog = `---PUT request--- ${status}\n${responseJson}\n`;
    engine.log(accessLog);
    throw `Failed to update record. status: ${status}`;
  }
}

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

  

Notes

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

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

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

Capture

See also

Appendix

  • kintone-record-update.xml (C) Questetra, Inc. (MIT License)
    • Professional をご利用であればファイルの内容を改変することでオリジナルのアドオンとして活用できます
%d人のブロガーが「いいね」をつけました。