Salesforce: オブジェクトレコード抽出・テーブル型格納 (Salesforce: Object records BatchGet to Table)
Salesforce 指定オブジェクトのレコードをテーブル型データ項目に格納します。クエリ(SOQL)を用いてSalesforce オブジェクトのレコードを抽出します。
Configs
  • A: HTTP認証設定を選択してください(OAuth2) *
  • B: サブドメインをセットしてください (https://{subdomain}.salesforce.com/) *
  • C: 検索用クエリをセットしてください *#{EL}
  • D: データが格納されるテーブル型データを選択してください (更新) *
  • E: JSON 最上位階層のキー名を記載してください eg. records *
  • F: json key/対応するテーブル型 field Id eg.CaseNumber:Number,… *
  • G: 通信ログが格納される文字列型データを選択してください (更新)
  • H: 取得したレコード数を格納する数値型データ項目を選択してください (更新)
Script (click to open)
// GraalJS Script (engine type: 2)
// Batch to Get Accounts from Salesforce via Salesforce REST API (ver. 50, Winter'21)
//
// OAuth2 config
// Authorization Endpoint URL: https://login.salesforce.com/services/oauth2/authorize
// Token Endpoint URL: https://login.salesforce.com/services/oauth2/token
// Scope:
// Consumer Key: (Get by Salesforce Connected App screen)
// Consumer Secret: (Get by Salesforce Connected App screen)


//////// START "main()" /////////////////////////////////////////////////////////////////
main();
function main(){

//// == 工程コンフィグの参照 / Config Retrieving ==
const oauth2      = configs.get( "conf_OAuth2" );         //required
const subDomain   = configs.get( "conf_SubDomain" );      //required
const strQuery    = configs.get( "conf_Query" );          //required
const objectList  = configs.getObject( "conf_DataIdD" );  //required
const strTopKey   = configs.get( "conf_DataIdE" );        //required
const strConfigJsonPaths = configs.get( "conf_DataIdF" );  //required
const strResponse = configs.getObject( "conf_DataIdG" );
const decRecordCount = configs.getObject( "conf_DataIdH" );


//// == ワークフローデータの参照 / Data Retrieving ==
// (Nothing. Retrieved via Expression Language in Config Retrieving)


//// == 演算 / Calculating ==
const uri = "https://" + subDomain + ".salesforce.com/services/data/v50.0/query/";
const response = httpClient.begin()
    .authSetting(oauth2)
    .queryParam("q", strQuery)
    .get(uri);
engine.log( " AutomatedTask ApiRequest Start: " + uri );

const responseCode = response.getStatusCode() + ""; // (primitive string);
const responseBody = response.getResponseAsString() + "";
engine.log( " AutomatedTask ApiResponse Status: " + responseCode );
if( responseCode !== "200" ){
  throw new Error( "\n AutomatedTask UnexpectedResponseError: " +
                    responseCode + "\n" + responseBody + "\n" );
}

if( strResponse !== null){
  engine.setData( strResponse, responseBody );
}

const objJsonText = JSON.parse( responseBody );
// set  key for getting data
const arrStrConfigJsonPaths = strConfigJsonPaths.split(",");
let arrJsonPathValues = new Array(objJsonText[strTopKey].length);
engine.log( " AutomatedTask: # lenght of arrJsonPathValues: " + arrJsonPathValues.length );
// setup List Type data item
let table = engine.findData(objectList);
table = objectList.createListArray();
//engine.log("responseBody: " + responseBody );
// parse json
for (let i=0; i < objJsonText[strTopKey].length; i++){
    arrJsonPathValues[i] = new Array(arrStrConfigJsonPaths.length);
    let row = table.addRow();
    for (let j=0; j < arrStrConfigJsonPaths.length; j++){
      let strConfigJsonPathAndCol = arrStrConfigJsonPaths[j].split(":");
      let arrSubKey = strConfigJsonPathAndCol[0].split(".");
      let obj = objJsonText[strTopKey][i];
      for (let k=0; k < arrSubKey.length; k++){
        obj = obj[arrSubKey[k]];
      }
      if (obj === null){
        arrJsonPathValues[i][j] = "";
      }else{
        arrJsonPathValues[i][j] = obj;
      }
//      engine.log("arrJsonPathValues[" + i + "][" + j+ "]" + arrJsonPathValues[i][j]);
      row.put(strConfigJsonPathAndCol[1] , arrJsonPathValues[i][j].toString() );
    }
}

//// == ワークフローデータへの代入 / Data Updating ==
// テスト用ログ表示
for (let i=0; i < arrJsonPathValues.length; i++){
  for (let j=0; j <  arrJsonPathValues[i].length; j++){
    engine.log("arrJsonPathValues[" + i + "][" + j + "]=" + arrJsonPathValues[i][j] );
  }
}
engine.setData(objectList, table);
engine.setData(decRecordCount, new java.math.BigDecimal(objJsonText[strTopKey].length) );
if( strResponse !== null){
  engine.setData( strResponse, responseBody );
}

} //////// END "main()" /////////////////////////////////////////////////////////////////

Download

2022-08-02 (C) Questetra, Inc. (MIT License)
https://support.questetra.com/ja/addons/salesforce-object-batchget-to-table-202208/
Addonファイルのインポートは Professional でのみご利用いただけます
自由改変可能な JavaScript (ECMAScript) コードです。いかなる保証もありません。

Notes

  • “C:検索用クエリをセットしてください” 設定
    • 抽出したいオブジェクトレコードに応じた SOQL(Salesforce Object Query Language) を記載します。
    • 設定例:SELECT id,CaseNumber,RecordTypeId, SuppliedName,Subject,Account.Website FROM Case
      • Case” オブジェクト の “id,CaseNumber,RecordTypeId, SuppliedName,Subject,Account.Website” データ項目を取得します。
      • (Salesforce オブジェクト)リレーション関係にあるデータ項目の指定例: “Account.Website” `-> {オブジェクト名}.{データ項目名}
  • “F:json key/対応するテーブル型 field Id eg.CaseNumber:Number” 設定
    • Salesforce から取得したオブジェクトレコード(Json)の”key”と対応する”テーブル型データ項目の列フィールド名”を列挙します。
    • 記載形式: {APIデータ項目名}:{テーブル型データ項目 列フィールド名},{APIデータ項目名}:{テーブル型データ項目 列フィールド名}…
    • 設定例:SuppliedName:webName
      • Salesforce API データ項目名:SuppliedName
      • Questetra テーブル型データ項目 列フィールド名: webName

Capture

See also

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

%d人のブロガーが「いいね」をつけました。