HubSpotを運用していると、「1つのプロパティに入力された複数の管理番号をもとに、関連するレコードを自動で紐付けたい」という場面に遭遇することがあります。
例えば、取引レコードにある「12345,67891」といったテキストデータを読み取り、該当する契約オブジェクト(カスタムオブジェクト)を自動で関連付けるケースです。
しかし、HubSpotの標準機能(ワークフロー)だけでは、テキストに含まれるIDを個別に判別して関連付けることは困難です。
カスタムコードアクションを活用することで、「プロパティ内の値を検索キーとして、一致する別オブジェクトを自動で探し出し、一括で関連付ける」という高度な自動化が実現します。
以下の手順で、取引プロパティから契約オブジェクトへの自動関連付けを設定します。
手順2. ワークフローの設定
「取引ベース」のワークフローを作成し、アクションに「カスタムコード」を選択します。
カスタムコード内でアクセストークンを安全に使用するため、ワークフロー設定画面の「シークレット」セクションに以下を追加します。
- シークレット名: 任意の文字列
- シークレット値: 手順1でコピーしたアクセストークン(
pat-から始まる文字列)
3. カスタムコードの記述
コードで実施している流れは下記です。
①特定のプロパティが「12345」の契約レコードを検索
②見つかったレコードIDで取引と関連付け
※エラー時1件失敗しても残りの処理を継続入力プロパティに、カスタムコード内で利用するプロパティを選択し、以下のようなコードを貼り付けます。
■コード例
---------------------------------------------------------------------------------------
const hubspot = require('@hubspot/api-client');exports.main = async (event, callback) => { const hubspotClient = new hubspot.Client({ accessToken: process.env.hs_access_token }); // ===== 設定項目(ここを変更してください) ===== const CUSTOM_OBJECT_TYPE_ID = 'YOUR_OBJECT_TYPE_ID'; // 例: '2-223104391' const SEARCH_PROPERTY_NAME = 'your_search_property'; // 例: 'id' const INPUT_FIELD_NAME = 'your_input_field'; // 例: 'id_input' // ============================================= const fromObjectType = 'deals'; const fromObjectId = event.object.objectId; const rawIds = event.inputFields[INPUT_FIELD_NAME]; if (!rawIds) { console.log(`${INPUT_FIELD_NAME} が空のため終了`); return callback({ outputFields: { processed_count: 0 } }); } const idArray = rawIds.split(',') .map(id => id.trim()) .filter(id => id.length > 0); console.log(`fromObjectId: ${fromObjectId}`); console.log(`検索値一覧: ${idArray}`); let successCount = 0; for (const searchValue of idArray) { try { // ① カスタムオブジェクトをプロパティ値で検索 const searchResult = await hubspotClient.crm.objects.searchApi.doSearch( CUSTOM_OBJECT_TYPE_ID, { filterGroups: [ { filters: [ { propertyName: SEARCH_PROPERTY_NAME, operator: 'EQ', value: searchValue } ] } ], properties: [SEARCH_PROPERTY_NAME], limit: 1 } ); if (!searchResult.results || searchResult.results.length === 0) { console.log(`${SEARCH_PROPERTY_NAME}=${searchValue} のレコードが見つかりませんでした`); continue; } const toObjectId = searchResult.results[0].id; console.log(`${SEARCH_PROPERTY_NAME}=${searchValue} → レコードID: ${toObjectId}`); // ② 関連付けを実行 await hubspotClient.apiRequest({ method: 'PUT', path: `/crm/v4/objects/${fromObjectType}/${fromObjectId}/associations/default/${CUSTOM_OBJECT_TYPE_ID}/${toObjectId}`, }); console.log(`関連付け完了: ${fromObjectType}=${fromObjectId} → ${CUSTOM_OBJECT_TYPE_ID}=${toObjectId}`); successCount++; } catch (err) { console.error(`${SEARCH_PROPERTY_NAME}=${searchValue} の処理中にエラー:`, err.message); } } callback({ outputFields: { processed_count: successCount } });};変更が必要なのは下記です。
| 変数名 | 設定内容 |
|---|---|
CUSTOM_OBJECT_TYPE_ID |
関連付け先オブジェクトのタイプID |
SEARCH_PROPERTY_NAME |
検索に使うプロパティの内部名 |
INPUT_FIELD_NAME |
ワークフローの入力フィールド名 |
プロパティーに情報を入れたうえでワークフローを動かすと一括で紐づけることができます。
導入後の変化
この設定を適用することで、取引レコードのプロパティに「12345,67891」と入力されるだけで、システムが自動的に背後で契約レコードを特定し、関連付けを完了させます。
データ入力の手間がなくなるだけでなく、常に最新の関連付け状態が維持されるため、レポート作成や売上予測の精度が向上します。
技術的な設定に不安がある場合は、まずはテスト用レコードで1件ずつ動作を確認することをお勧めします。