Heroku AppLinkの使い方 (クエリ)

Heroku AppLinkのサンプルコードがもう少し欲しいところ...で、まずはクエリのサンプルでも備忘録として残してみる
※サンプルコードは Node.js 版のSDKを使ったものに限定です。SDKのリポジトリは https://github.com/heroku/heroku-applink-nodejs を参照してください。

1. 1つのオブジェクトだけクエリする

import * as salesforcesdk from "@heroku/applink";

const sfdc_id = 'xxxxx';

async function sample () {
  const sdk = salesforcesdk.init();
  // ※Authorized Userを使います
  const org = await sdk.addons.applink.getAuthorization(process.env.HEROKU_APPLINK_CONNECTION_NAME);

  // 取引先を取得する
  const accountQueryResult: salesforcesdk.RecordQueryResult = await org.dataApi.query(
    `select id,name from account where id = '${sfdc_id}'`
  );
  // accountQueryResult:
  // {
  //   records: (レコードの配列)
  //   totalSize: (クエリした全レコード件数)
  //   done: (falseだと、次のページリンクがある)
  //   nextRecordsUrl: (次ページのリンク)
  // }
  
  const accountRecords: salesforcesdk.QueriedRecord[] = accountQueryResult.records;
  // accountRecords:
  // [
  //   {
  //     type: (オブジェクトAPI)
  //     fields: (レコード内の属性がオブジェクトとして格納)
  //     subQueryResults: (サブクエリがあれば)
  //   }
  // ]
  const accountRecord: salesforcesdk.QueriedRecord = accountRecords[0];
  const account: { [key: string]: unknown } = accountRecord.fields;
  console.log(account.id);
  console.log(account.name);
  
}

2. サブクエリも追加してみる

import * as salesforcesdk from "@heroku/applink";

const sfdc_id = 'xxxxx';

async function sample () {
  const sdk = salesforcesdk.init();
  const org = await sdk.addons.applink.getAuthorization(process.env.HEROKU_APPLINK_CONNECTION_NAME);

  // 取引先と、それに紐つく取引先責任者を取得する
  const accountQueryResult: salesforcesdk.RecordQueryResult = await org.dataApi.query(
    `select id,name,(select name from contacts) from account where id = '${sfdc_id}'`
  );
  
  const accountRecords: salesforcesdk.QueriedRecord[] = accountQueryResult.records;
  const accountRecord: salesforcesdk.QueriedRecord = accountRecords[0];

  // subQueryResults内に、子リレーション名をkeyにした RecordQueryResult があるのでそれを取得する
  const contactQueryResult: salesforcesdk.RecordQueryResult = accountRecord.subQueryResults.contacts;
  if (contactQueryResult.totalSize == 0) {
    console.log('取引先責任者なし');
  }
  const contactRecords: salesforcesdk.QueriedRecord[] = contactQueryResult.records;
  contactRecords.forEach((record) => {
    // 取引先責任者名
    console.log(record.fields.name);
  });
}

3. 親オブジェクトへのリレーションを追加してみる

import * as salesforcesdk from "@heroku/applink";

const sfdc_id = 'xxxxx';

async function sample () {
  const sdk = salesforcesdk.init();
  const org = await sdk.addons.applink.getAuthorization(process.env.HEROKU_APPLINK_CONNECTION_NAME);

  // 商談と、商談明細をクエリする
  // 商談明細には、商品の商品名もクエリする
  const opportunityQueryResult: salesforcesdk.RecordQueryResult = await org.dataApi.query(
    `select id,name,(select id,product2.name from opportunitylineitems) from opportunity where id = '${sfdc_id}'`
  );

  const opportunityRecords: salesforcesdk.QueriedRecord[] = opportunityQueryResult.records;
  const opportunityRecord: salesforcesdk.QueriedRecord = opportunityRecords[0];

  const opportunitylineitemQueryResult: salesforcesdk.RecordQueryResult = opportunityRecord.subQueryResult.opportunitylineitems;
  const opportunitylineitemRecord: salesforcesdk.QueriedRecord = opportunitylineitemQueryResult.records[0];
  // opportunitylineitemRecord: 
  // {
  //   type: 'opportunitylineitem',
  //   fields: {
  //     id: '00kA...',
  //     product2: {
  //       type: 'product2',
  //       fields: {
  //         name: 'xxxxx...'
  //       }
  //     }
  //   }
  // }

  // 商談明細が参照する商品レコードを取得する
  const productRecord: salesforcesdk.QueriedRecord = opportunitylineitemRecord.fields.product2;
  // productRecord:
  // {
  //   type: 'product2',
  //   fields: {
  //     name: 'xxxx'
  //   }
  // }
  console.log(productRecord.field.name);
  
}

Read more

Agentforce

文字起こしエージェントアクションの追加(Summer'26)

エージェントアクションにWhisper V3 Turbo (Whisper Large V3 Turboと思われる)による文字起こし機能が追加。6/22週から利用可能。 * Whisperはセルフホストっぽい。 * 5MB未満 * 話者識別やタイムスタンプはない。 電話音声だと帯域狭いから、適切な前処理すれば50分ぐらいいけるかも。MP3 64Kbpsだと10分ほどの計算になる。 Choose a Transcription Model for the Speech to Text Agent Action Use the Transcription Model parameter on the Speech to Text action to control which model converts audio to text. Choose the model

By Hiroki Matsumoto

Salesforce

Multi-FrameworkでReactAppを(内部向けアプリ)

あれ、もうGAになったのかな? 前に外部向け(Experience Cloud)のReact Appを作成してみたので、今度は内部向けも試してみる。今回はSandbox環境にデプロイして動かせるのか試してみよう。 内部向けのsfdxプロジェクトを作成 今回は --template に reactinternalapp を指定する $ sf template generate project --name wkInReactApp --template reactinternalapp npmパッケージのインストール&ビルド READMEにある通りに、作成したプロジェクトのルートディレクトリで、以下を実行する $ npm install $ npm run sf-project-setup > @salesforce/ui-bundle-template-base-sfdx-project@1.135.0 sf-project-setup >

By Takahiro Yonei

Salesforce

Multi-FrameworkでReactAppを(外部向けアプリ)

拝啓 もうすぐGAでしょうか... Salesforce Mult-Framework を使用した React による UI 開発 SalesforceでReactアプリを動かせるようになるということで試してみた備忘録を記録してみます。 以下、ご参考 GitHub - trailheadapps/multiframework-recipes: A collection of easy-to-digest code examples for React on Salesforce PlatformA collection of easy-to-digest code examples for React on Salesforce Platform - trailheadapps/multiframework-recipesGitHubtrailheadapps 公式ドキュメント -> Integrate Your React

By Takahiro Yonei