Microsoft 365

「複数の項目の取得」アクションのフィルターに列の内部名を指定してもエラーになる

Power Automate のアクション「複数の項目の取得」で SharePoint Online のリストから情報を抜くときには、フィルタークエリを設定して、条件に合致するアイテムだけを取得します。例えば「○×列の値が△△以上かつ◇◇以下」のように記述するのですが、この時、対象とする列は、表示名ではなく「内部名」で指定するのがポイントです。

ところが。きちんと内部名で書いているのに「アクション ‘複数の項目の取得’ に失敗しました」「列 ~が存在しません。他のユーザーが削除した可能性があります」とエラーになることがあります。

20210716image01

問題が発生しないパターン

タイトル列など既定で存在する列や、作成時に半角英数字で名前をつけた列は、内部名がシンプルです。「Title」「Created」「kigen」「status」等。これは SharePoint の仕様です。

こうしたシンプルな列については、きちんと内部名で指定すれば問題は発生しません。ブログ等で見かける各種サンプルも、大抵はこのパターンです。

20210716image02

問題が発生するパターン

次に、作成時に列名を日本語でつけてしまった列。この場合、内部名は SharePoint が自動的に決め、かつグチャグチャになります。例えば「期限」列は「_x671f__x9650_」です。これも SharePoint の仕様です。

そして、この可読性が無い(低い)内部名の場合、これをそのままフィルタークエリで指定すると、前述のエラーが発生します。

20210716image03

回避方法は頭に「OData_」をつける

列の内部名に「OData_」をつけて指定してください。上の「期限」列であれば「OData__x671f__x9650_」になります。これでフィルタークエリが期待通りに動作するはずです(式に他のミスがなければ)。

20210716image04

ハマりました…

いやはや。

SharePoint REST API の仕様として「内部名が数字または記号で始まる場合には『OData_』をつける」ことは知っていましたが(正直に言えばすっかり忘れてましたけれど)、Power Automate でも同じなんですね。「アクション」という形でも、裏では API でクエリが実行されている訳ですから、同一でもおかしくはないのですが。思いつかなかった…。

コードで触ることが想定されるなら、列名はまずアルファベット(スペースなし)で設定し、後から日本語に変更すべき」という SharePoint 開発の基本を守ることが一番だ、と久々に痛感しました。

以下参考:
SharePoint 2013 で列の内部名を調べる方法
Power Automate SharePointリスト「複数の項目の取得」のフィルターとかで使える、OData演算子まとめ
Power Automate 「複数の項目を取得(SharePoint)」アクション
SharePoint REST – Get Fields whose Name starts with a Number or Special Character