SalesforceをJavaScriptで操作しよう!(JSforceによるクエリでIN句を表現する)

2022.08.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

SalesforceのオブジェクトをIN句で検索する

Salesforceのレコード検索に用いるSOQL(Salesforce Object Query Language)では、次のようにIN句を使ってレコードを絞り込むことができます。

/* 名前(Name)がA社、B社、C社のいずれかにマッチする取引先だけ取得する */
List<String> names = new List<String>{'A社', 'B社', 'C社'};
List<Account> accounts = [SELECT Id, Name, CreatedDate FROM Account WHERE Name IN :names];
System.debug(accounts);

JSforceはJavaScriptからSalesforceのAPIにアクセスするライブラリです。
このJSforceで先述のIN句を使うためには次のようにします。

const names = ['A社', 'B社', 'C社']
const accounts = []
conn
  .sobject("Account")
  .find({
    'Name': { $in: names }
  }, ['Id', 'Name', 'CreatedDate'])
  .on("record", (record) => {
    accounts.push(record)
  })
  .on("end", () => {
  })
 .on("error", (err) => {
    console.error(err)
  })
  .run({ autoFetch : true, maxFetch : 100 })

この例だと、3つ(A社、B社、C社)しか選択肢がないので、あまり有り難みがわかりませんが、何百、何千件という要素のListをIN句に渡したいときに便利です。直にSOQLを構築するやり方だと、SOQLの長さ制限に引っかかってしまいますので。

SOQL と SOSL の制限 | Salesforce の制限クイックリファレンスガイド | Salesforce Developers

IN句以外にもいろいろあります

IN句の他にも、LIKEや比較演算子(<, <=, >, >=)も使えます。

conn.sobject("Contact")
  .find({
    LastName: { $like : 'A%' },
    CreatedDate: { $gte : jsforce.Date.YESTERDAY },
    'Account.Name': { $in ['クラスメソッド株式会社', 'アノテーション株式会社'] }
  }, [ 'Id', 'Name', 'CreatedDate' ])
  .execute(function(err, records) {
    if (err) { return console.error(err) }
    console.log("fetched : " + records.length)
    console.log(JSON.stringify(records, null, 2))
  })

この例では、親の取引先名が「クラスメソッド株式会社」か「アノテーション株式会社」で、名字がAで始まる、昨日以降に作られた取引先責任者を取得しています。

現在、サポートしているのは次のオペレータのようです。

オペレータ 作用
$ne != (not equal)
$lt < (less than)
$lt <= (less than equal)
$gt > (grater than)
$gte >= (grater than equal)
$in IN
$nin NOT IN
$like LIKE
$exists EXISTS

JSforceの何が嬉しい?何が便利?

この他にもJSforceを使うと

  • レコードのCRUD(Create, Retrieve, Update, Upsert, Destroy)が可能
  • Metadataを扱える
  • Apex REST APIをコールできる
  • Bulk処理ができる

などが簡単にできますので、次のようなメリット、便利さがあります。

  • JavaScript、Node.js、Visualforce、コマンドラインから簡単にSalesforce APIを実行できる
  • 特にコマンドラインから使えるちょっとしたツールを作るのに便利
    • 私が過去に作ったことのある具体例
      • 組織のAccount、Contact、Leadなどの重複を調べるツール
      • 組織の重複レコードをマージするツール
      • 組織から取り出した情報で他のAPIのPATCHを呼び出して、更新をかけるツール
  • React Nativeなど、アプリからSalesforce APIを呼び出すことにも使える

JavaScriptに慣れた人にとってはかなり便利に使えるライブラリですので、おすすめですー。