開発コンソールでデータを一括更新するには?
Salesforce で「ワークフロー項目自動更新」や「Apexトリガ」を新しく追加しても既存のデータに同じ処理を適用することはできません。
これはワークフロー・Apexトリガはレコードの新規作成・更新時にのみ実行されるためです。
そのため設定した処理を既存のデータに適用するには何らかの更新を行わなければなりません。
「開発者コンソール」機能をつかって簡易な Apexプログラムを実行すれば、データの更新日付のみを変更することができます。
これによりワークフローやトリガで用意した処理を既存のレコードに対しても適用できます。
今回手順を説明するにあたり
「リード」に対して新しく設定した「ワークフロー項目自動更新」を適用するために既存のデータをすべて更新(更新日付以外の内容はそのまま)する例を考えます。
- 「ユーザメニュー」を開いて [ 開発者コンソール ] をクリックします。
- 下記のようなウィンドウがポップアップで表示されます。
- 「Debug」から「Open Execute Anonymous Windw」を選びます。
- 「開発者コンソール」の中でさらに新しいウィンドウが表示されます。
- 表示されたウィンドウに以下のプログラム(コード)を貼り付けてください。
List <lead> lst = [ select id from lead where isdeleted=false and isconverted=false and LastModifiedDate <> LAST_N_DAYS:0 LIMIT 100] ; if (lst.size() > 0 ) { update lst; system.debug('★' + lst.size() + '件 更新しました★'); } else { system.debug('★該当データなし★'); }
このコードはすべての有効なリードから更新日付が「今日」のものを除いて最大100件まで抽出してそれらを一括で更新しています。
更新する項目は「id」だけですので「更新日付」だけが最新になります。
これにより「ワークフロー項目自動更新」や「Apexトリガ」の処理がレコードに適用されます。
ここで指定している「LAST_N_DAYS:0」は、Salesforceにおける特殊な日付指定のひとつです。ほかにもいろいろな指定ができます。くわしくは Salesforceのマニュアル「Date Formats and Date Literals」をご参照ください。
今回はりつけたコードは「リード」を更新するものです。
その他のオブジェクトを対象にしたい場合は上記のコードのうち角括弧内([])の内容を差し替えます。
また特定のレコードのみ(作成時期や特定の項目値をもったもの)を対象にしたい場合はコードの条件を追加してください。オブジェクト名 API参照名 コード (角括弧”[]”内のみ) 取引先責任者 Contact select id from Contact where isdeleted=false and LastModifiedDate <> LAST_N_DAYS:0 LIMIT 100 ケース Case select id from Case where isdeleted=false and LastModifiedDate <> LAST_N_DAYS:0 LIMIT 100 商談 Opportunity select id from Opportunity where isdeleted=false and LastModifiedDate <> LAST_N_DAYS:0 LIMIT 100 - 貼り付けたあとに [ Execute ] をクリックします。
- プログラムが実行された結果が「ログ」として表示されます。
- 「DEBUG|★すべて更新★」というログが出ていれば、すべてのレコードが更新されたことになります。
「ログ」は他の情報も表示されますので、「DEBUG|…」が見つけにくいかもしれません。その場合は「Debug Only」にチェックをいれてください。「DEBUG|…」のログのみが表示され、結果がわかりやすくなります。
↓
データの更新はSalesforceのガバナ制限を回避するため、100件ずつ更新しています。
対象データが100件以上ある場合は「★該当データなし★」が表示されるまで [ Debug ] | [ Execute Last ] をクリックして何度か繰り返し実行してください。
- [ 歯車マーク ] | [ 開発者コンソール ] をクリックします。
- 「開発者コンソール」を開くと下記のようなウィンドウがポップアップで表示されます。
[ Debug ] | [ Open Execute Anonymous Windw ] を選びます。
- 「開発者コンソール」の中でさらに新しいウィンドウが表示されます。
- 表示されたウィンドウに以下のプログラム(コード)を貼り付けてください。
List <lead> lst = [ select id from lead where isdeleted=false and isconverted=false and LastModifiedDate <> LAST_N_DAYS:0 LIMIT 100] ; if (lst.size() > 0 ) { update lst; system.debug('★' + lst.size() + '件 更新しました★'); } else { system.debug('★該当データなし★'); }
このコードはすべての有効なリードから更新日付が「今日」のものを除いて最大100件まで抽出してそれらを一括で更新しています。
更新する項目は「id」だけですので「更新日付」だけが最新になります。
これにより「ワークフロー項目自動更新」や「Apexトリガ」の処理がレコードに適用されます。
ここで指定している「LAST_N_DAYS:0」は、Salesforceにおける特殊な日付指定のひとつです。ほかにもいろいろな指定ができます。くわしくは Salesforceのマニュアル「Date Formats and Date Literals」をご参照ください。
今回はりつけたコードは「リード」を更新するものです。
その他のオブジェクトを対象にしたい場合は上記のコードのうち角括弧内([])の内容を差し替えます。
また特定のレコードのみ(作成時期や特定の項目値をもったもの)を対象にしたい場合はコードの条件を追加してください。オブジェクト名 API参照名 コード (角括弧”[]”内のみ) 取引先責任者 Contact select id from Contact where isdeleted=false and LastModifiedDate <> LAST_N_DAYS:0 LIMIT 100 ケース Case select id from Case where isdeleted=false and LastModifiedDate <> LAST_N_DAYS:0 LIMIT 100 商談 Opportunity select id from Opportunity where isdeleted=false and LastModifiedDate <> LAST_N_DAYS:0 LIMIT 100 - 貼り付けたあとに [ Excecute ] をクリックします。
- プログラムが実行された結果が「ログ」として表示されます。
「DEBUG|★すべて更新★」というログが出ていれば、すべてのレコードが更新されたことになります。
「ログ」は他の情報も表示されますので、「DEBUG|…」が見つけにくいかもしれません。
その場合は「Debug Only」にチェックをいれてください。「DEBUG|…」のログのみが表示され、結果がわかりやすくなります。
↓
データの更新はSalesforceのガバナ制限を回避するため、100件ずつ更新しています。
対象データが100件以上ある場合は「★該当データなし★」が表示されるまで [ Debug ] | [ Execute Last ] をクリックして何度か繰り返し実行してください。
以上が開発コンソールでデータを一括更新する方法です。
他にも「特定の条件に合致するデータの項目を一括で変更する」などの応用ができます。
データの更新を行うため十分な注意が必要ですが、うまく利用すると業務を効率的にすすめることができますのでぜひ参考にしてください。