本記事は、Office File Creatorを使用したフローをリストビューから実行した場合、CORSエラーで処理中から先に進まない場合の対処法についての説明です。
エラーが発生するケース
次の1~4すべての条件に当てはまる特定の条件下で、CORSエラーが発生します。
- Lightning Webセキュリティが無効
- 管理パッケージのLWC(Lightning Webコンポーネント)より静的リソースを参照
- フローで使用
- リストビュー、またはFlow Builderの「実行」ボタンより実行 (「デバッグ」ボタンはエラーは発生しません)
Lightning Webセキュリティの有効/無効の確認方法
設定>セッションの設定より、「Lightning Web コンポーネント用および Aura コンポーネント用 Lightning Web セキュリティの使用」より有効/無効を確認します。
Office File Creatorの静的リソース使用について
Office File Creatorの出力ファイル種類がExcel、Word、PowerPoint出力時に、静的リソース(Javascriptライブラリ)を読み込み、ZIPファイルの解凍、圧縮を行います。Officeファイルの実体は、複数のXMLファイルがZIPファイル化されています。PDF出力時は、静的リソースを参照しないため、エラーは発生しません。
CORSエラーが発生しているかの確認方法
ブラウザのコンソール画面を開きます。Chromeの場合、キーボードのF12でコンソール画面が表示されます。コンソール画面に「Access to XMLHttpRequest at・・・」と表示されていれば、CORSエラーが発生しています。
解決策と代替案
解決策
エラーの対処法として、Lightning Webセキュリティを有効化します。有効化において留意事項があります。
- 本番組織でLightning Webセキュリティを有効化する前に、組織内のプログラム、管理パッケージに影響がないことをSandboxで確認する必要があります。
- Lightning Webセキュリティを有効/無効を切り替え時は、ブラウザのキャッシュを削除、ログアウトが必要となります。
*Lightning Webセキュリティの有効化については、組織のシステム管理者、Salesforceヘルプにお問い合わせください。
参考
Lightning Web セキュリティによるコンポーネントのセキュリティの改善、強化、迅速化 (正式リリース)
代替案
Lightning Webセキュリティを有効化できない組織の場合、代替案として、データテーブルを配置したフローをアプリケーションページで実行します。レコードの選択は、リストビューの代わりにデータテーブルを使用します。アプリケーションページ上ではエラーは発生しません。
フロー概要
- 対象オブジェクトのレコードを取得
- データテーブルに取得したレコードをセット (リストビューの代わり)
- OFC実行
- アプリケーションページにフローを配置
詳細は、以下を参照してください。
Salesforceのフローのデータテーブルで選択したレコードの帳票を出力する
*Flow Builderの「実行」ボタンでのエラーについては、「実行」ボタンの代わりに「デバッグ」ボタンを使用してください。
(参考) エラーの考察
CORSエラーは外部のドメインURLにアクセスした際に発生するエラーです。管理パッケージの静的リソースのドメインURLに名前空間が付与されているため、基のドメインと異なるURLにアクセスと判断され、CORSエラーが発生しています。但し、管理パッケージの静的リソースのドメインURLには名前空間が付与されており、設定画面からはアクセス可能なため、特定の画面において発生するエラーのようです。
基のドメインURL
https://mydomain--demo--c.sandbox.vf.force.com/resource/
遷移先URL
https://mydomain--demo--ofc2.sandbox.vf.force.com/resource/
エラーメッセージ
Access to XMLHttpRequest at "xxxxx"
from origin 'xxxxx' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
静的リソースURL
設定>静的リソースより、「ファイルを表示」リンクには、ドメインURLに名前空間が付与されています。通常、管理パッケージのリソースへアクセス時、名前空間+__+リソース名でアクセスし、ドメインURLには名前空間を付与しません。ドメインURLに名前空間が付与されるのは奇妙な感じですが、「ファイルを表示」リンクをクリックで、問題なく静的リソースをダウンロードすることができます。
LWCコード
Office File CreatorのLWCでは、Salesforceの通常の方法で静的リソースを読み込んでいます。管理パッケージ作成時、すべてのリソースに自動で名前空間が付与されます。特定の条件下で発生するエラーのため、LWCのコードに問題があるわけではなさそうです。
//静的リソースをインポート
import { loadScript } from 'lightning/platformResourceLoader';
import JSZIP_JS from '@salesforce/resourceUrl/OFC_Zip';
//静的リソースを読み込み
loadJsZip() {
Promise.all([
loadScript(this, JSZIP_JS + '/jszip.min.js')
])
.then(() => {
//execute file output
})
.catch((error) => {
console.log('error', error);
});
}
CORS設定
CORSの許可リストに登録を試しましたが、エラーは解消されませんでした。
設定>CORS>許可されたオリジンリスト
https://mydomain--demo--c.sandbox.vf.force.com
https://mydomain--demo--ofc2.sandbox.vf.force.com
(参考) 類似事例
過去のエラーで似たような事例がありました。こちらは、Auraコンポーネント+静的リソース(管理パッケージ)で、Winter 21のあるリリース更新を適用するとCORSエラーが発生するというものでした。
Winter 21
Lightning コンポーネントの安全な静的リソースの有効化 (更新、延期)
既知のエラー
Summer 22
Enable Secure Static Resources for Lightning Components (Update, Postponed)
(参考) Lightning Webセキュリティの有効化時の影響
Lightning Webセキュリティを無効から有効に切り替え時、LWC開発において影響があった例を記します。
LWCでAura機能の使用時にエラー
LWCでAura Componentのイベント$A.getをevalで使用時、Lightning Webセキュリティ有効時にエラーとなりました。以下は、レコード画面のコンポーネントの表示を更新するコードです。実行すると、「$A is not defined」のエラーメッセージが表示されます。
eval("$A.get('e.force:refreshView').fire();");
このエラーについては、LWCのRefreshEvent機能がリリースされ、コードを置き換えることで解決しました。
RefreshEvent
//RefreshEventをインポート
import { RefreshEvent } from 'lightning/refresh'
//画面内のコンポーネントの表示を更新
this.dispatchEvent(new RefreshEvent());
LWCの大量のループ処理に著しく時間がかかる
LWCに大量データのループがある場合、処理に著しく時間がかかる場合があります。
参考
LWCs cause 10-20 seconds of lag populating a small amount of elements on the page
(参照元: StackExchange)
Office File Creatorで、通常のファイル出力では無効化時とさほど処理時間は変わりませんが、レコード値の画像出力時(OFC Proの機能)、画像サイズが合計5MB以上の場合は、出力処理に数十秒かかります。このため、レコード値の画像出力時は、原則カスタムボタンの使用が推奨されます。カスタムボタンから実行時は、出力処理を一部Visualforce側で処理をしています。
*Lightning Webセキュリティの有効化については、組織のシステム管理者、Salesforceヘルプにお問い合わせください。