AirTable: Add New Record
Adds a new record to the AirTable Base.
Configs
  • A: Select Authorization Setting in which API key is set *
  • B: Set Base ID *
  • C: Select STRING DATA for Record ID (update)
  • D1F: Set Field Name 1
  • D1V: Select STRING DATA for Value 1#{EL}
  • D2F: Set Field Name 2
  • D2V: Select STRING DATA for Value 2#{EL}
  • D3F: Set Field Name 3
  • D3V: Select STRING DATA for Value 3#{EL}
  • D4F: Set Field Name 4
  • D4V: Select STRING DATA for Value 4#{EL}
  • D5F: Set Field Name 5
  • D5V: Select STRING DATA for Value 5#{EL}
Script (click to open)


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

main();
function main(){
  //// == 工程コンフィグ・ワークフローデータの参照 / Config & Data Retrieving ==
  const authSettingName = configs.get("conf_auth");
  const baseId = configs.get("conf_baseId");
  const recordIdDef = configs.getObject("conf_recordId");
  const recordObj = retrieveRecordContent();

  //// == 演算 / Calculating ==
  const apiUri = determineApiUri( baseId );
  const recordId = addRecord( apiUri, authSettingName, recordObj );

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


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

    const fieldName = configs.get( fieldNameConfigName );
    if ( fieldName === "" || fieldName === null ) { // フィールドコードが空
      continue;
    }
    if ( recordObj[fieldName] !== undefined ) { // フィールドコードの指定が重複
      throw "The same Field Name is set multiple times.";
    }
    
    let fieldValue = configs.get( fieldValueConfigName );
    if ( fieldValue === "" || fieldValue === null ) { // 値が空
      fieldValue = null;
    }
    recordObj.records[0].fields[fieldName] = fieldValue;
  }
  return recordObj;
}


/**
  * REST API のレコード追加の URI を決定する
  * ドメインが空、または kintone のドメインとして不正な文字列であればエラーとする
  * ゲストスペース ID が不正な文字列であればエラーとする
  * @param {String} baseId  ゲストスペース ID
  * @return {String} apiUri  API の URI
  */
function determineApiUri( baseId ) {
  let apiUri = "";
  apiUri = `https://api.airtable.com/v0/${baseId}/Table1?maxRecords=3&view=Grid%20view`;

  return apiUri;
}


/**
  * REST API にレコード追加の POST リクエストを送信する
  * アプリ ID が空、または不正な文字列であればエラーとする
  * @param {String} apiUri  API の URI
  * @param {String} authSettingName  API key を含む認証設定
  * @param {Object} recordObj  レコード情報の JSON オブジェクト
  * @return {String} recordId  レコード ID
  */
function addRecord( apiUri, apiToken, recordObj ) {
  const body = recordObj;
  engine.log(`API URI: ${apiUri}`);
  engine.log(`Request Body: ${JSON.stringify(body)}`);
  const response = httpClient.begin()
    .authSetting(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;
}


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

  

Download

2021-12-15 (C) Questetra, Inc. (MIT License)
https://support.questetra.com/addons/airtable-record-add/
The Add-on import feature is available with Professional edition.
Freely modifiable JavaScript (ECMAScript) code. No warranty of any kind.

Notes

  • Please refer to this page to get the API key, Base ID, etc. for AirTable settings. Also, for HTTP authentication settings on Questetra, please use direct token specification.

Capture

%d bloggers like this: