「複数の項目の取得」アクションのフィルターに列の内部名を指定してもエラーになる
2021.07.21
Power Automate のアクション「複数の項目の取得」で SharePoint Online のリストから情報を抜くときには、フィルタークエリを設定して、条件に合致するアイテムだけを取得します。例えば「○×列の値が△△以上かつ◇◇以下」のように記述するのですが、この時、対象とする列は、表示名ではなく「内部名」で指定するのがポイントです。
ところが。きちんと内部名で書いているのに「アクション ‘複数の項目の取得’ に失敗しました」「列 ~が存在しません。他のユーザーが削除した可能性があります」とエラーになることがあります。
問題が発生しないパターン
タイトル列など既定で存在する列や、作成時に半角英数字で名前をつけた列は、内部名がシンプルです。「Title」「Created」「kigen」「status」等。これは SharePoint の仕様です。
こうしたシンプルな列については、きちんと内部名で指定すれば問題は発生しません。ブログ等で見かける各種サンプルも、大抵はこのパターンです。
問題が発生するパターン
次に、作成時に列名を日本語でつけてしまった列。この場合、内部名は SharePoint が自動的に決め、かつグチャグチャになります。例えば「期限」列は「_x671f__x9650_」です。これも SharePoint の仕様です。
そして、この可読性が無い(低い)内部名の場合、これをそのままフィルタークエリで指定すると、前述のエラーが発生します。
回避方法は頭に「OData_」をつける
列の内部名に「OData_」をつけて指定してください。上の「期限」列であれば「OData__x671f__x9650_」になります。これでフィルタークエリが期待通りに動作するはずです(式に他のミスがなければ)。
ハマりました…
いやはや。
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