OutSystems の Advanced Excel で Excel ファイルを出力したところ、一部セルの入力規則が解除されてしまう事象が発生した。
原因と回避方法について記載する。
対象
- OutSystems 11 で forge「Advanced Excel」を使用している方
事象
- Advanced Excel にて Excel ファイル出力時、一部セル(列)の入力規則が解除されてしまう
発生条件
- 同じ条件での入力規則が複数のセル範囲にある
例) A列及びC列が同じ入力規則になっている - Row_Insert アクションで行の追加を行っている。
なお、追加した行だけでなく、対象列すべての行に対する入力規則が解除されてしまう。
※ Row_Insert 以外でも発生する可能性あり。
原因
Excel ファイル(xlsx)を解凍した際、入力規則(formula1)の適用セル(sqref)が複数の範囲になっていると事象が発生する。
回避方法
入力規則(formula1)の適用セル(sqref)が単一の範囲になるようにする。
再現手順と原因
使用するツールやアカウントなど
- OutSystems 11
- Advanced Excel (記載時のバージョンは 2.2.17)
- Excel for the web (Microsoft 365 無料版) ※通常のExcelでも可
再現手順
テンプレート Excel の作成
Action の作成
テンプレートファイルを読み込み、 Row_Insert で 10 行目に行を追加。
このバイナリデータをダウンロードする処理を作る(記載省略)。
Action を実行し、事象が再現しないことを確認(10行目に行が追加され、A列とB列の入力規則がある)。
テンプレートファイルのA列をC~E列へコピー&ペーストし、 Resouces 上のファイルも更新。
再度 Action を実行し、事象が再現することを確認。
(10行目に行が追加され、A列とB列の入力規則があるが、C~E列の入力規則がない。)
原因(仮説と検証)
仮説
問題を切り分けていった結果、 Excel ファイルの内容(ワークシートの XML)によって事象が発生すると推測した。
xlsx ファイルは zip ファイルなので、解凍することでワークシートの XML ファイルを確認することができる。
上記、再現手順の xlsx を解凍すると入力規則の適用セルが「A2:A20 C2:E20」と指定されていることが確認できる。
『セル範囲 (sqref 属性) において、半角ブランクで区切られた範囲は無視され、最初の範囲しか認識されていないのでは?』という仮説を立て検証を行う。
検証
A列をコピー&ペーストせずに、C~E列のそれぞれに対しA列と同様の入力規則を設定する。
Resouces のファイルを更新し、再度 Action を実行すると、C列に入力規則があるがD~E列は入力規則がなくなっている。
ワークシートの XML は以下のようになっている。
A列をコピー&ペーストしなかったことにより、A列の入力規則とC~E列の入力規則は別々の定義となっているが、C~E列は1つの sqref 属性内で定義されていることがわかる。
A~C列は入力規則があり、D~E列は入力規則が解除されていたことから、この時点で仮説が正しいと考えられる。
回避方法
各列に対し、他と重複しない入力規則を設定した後、正しい入力規則に設定する。
例) C列に「1」、D列に「2」、E列に「3」のような他と重複しない入力規則を一度設定した後、C~E列にA列と同じ入力規則(A,B,C)を設定する。
Resouces のファイルを更新し、再度 Action を実行すると、A~E列の入力規則が残っていることが確認できる。
ワークシートの XML を確認すると、各 sqref 属性には1つの範囲しか指定されていないことも確認できる。
XML 出力内容が原因であることから、1度回避しても再度テンプレートファイルを更新した際に事象が再現してしまう危険性あり。
Excel のバージョン等によっても結果が変わる可能性あり。
このことから、 Advanced Excel のアクションを使って入力規則を設定する等を検討するのもアリ!
あとがき
原因が原因なだけに、入力規則以外にも『ここのセルは正しいのに、こっちのセルはおかしい』なんて事象が発生したら XML の内容を確認してみるとヒントがあるかも!
さいごに
株式会社メディアテックでは絶賛 開発メンバを募集中 です。
ローコード開発だけではなく、RPAやBIエンジニア諸々多数の募集をしておりますので、みなさまのご応募をお待ちしております。