Power Automateで「指定列に1つでも空欄があったらメッセージを送る」という設定をするには?

久々に書くことが今までの内容と全然違うのでアレですが、ググっても中々ドンピシャのが出てこなかったし、折角なのでメモ。

まずPower Automateについて、私は「会社でRPA化せよって言われてるし、使ってみようかね。アカウントは会社のがあるしね。」と言うノリでいじり始めて、関連本とか借りてはみたけれどもきちんと読んではないよという程度のスキルということを言い訳も兼ねて書いておく。ついでに言えば、デスクトップ版もダウンロードしているけれども、Teamsのチャネルに保管しているファイルを直接参照したかったので、ブラウザ版を今回は使ってます。 [1] … Continue reading

私のやりたかったことは割と単純で、タイトルにある通り「指定列に1つでも空欄があればTeamsのチャネルにリマインドメッセージを送る(空欄行数に関わらず1通のみ)」というもの。とりあえずempty関数なるものが空欄判定に使えるというのをググって知った私は「Excel Onlineからテーブルの情報を取ってくる」→「empty関数で条件分岐を設定し、Trueならメッセージを送る」というフローを作ったのだが [2]とかるーく書いてますが、実際はempty関数は「true」に等しい、と条件設定しないとダメだとか、まぁ色々ありました。、なんでか複数行のテーブルで「空欄のみ」「一部空欄」「全部空欄じゃない」の3パターンで結果が変わらないことがテストで判明。これを解決するのに数時間かけたのでした。ググったりもしましたが、ほぼchatGPTとの会話で解決しました。以下、まずchatGPTとのやりとりがどんな流れだったのかと、最終的に設定したフローです。

最初に(というより考え始めて5時間後くらいに)emptyかどうかだけではなく、全部空欄じゃない場合も条件に設定が必要ではないか?と思いついたので、その方向でchatGPTに尋ねてたんですが、どうもうまくいかないので、改めて以下の質問したところ

1,2行目が空ではなく、3行目に空の場合にTrueを返す式はどのようになりますか?見出し行をのぞいて、3行あるテーブルの場合、以下のようになる式です
1行目空:True
3行目が空:True
1~3行目全て空ではない:False

回答がこれ↓

理解しました。指定された条件に基づいて、1行目が空であれば True、3行目が空であれば True、1~3行目がすべて空でなければ False を返す式は以下の通りです:

plaintext
Copy code
or(empty(Outputs('表内に存在する行を一覧表示')?['body/value']?[0]?['(列名)']),
   empty(Outputs('表内に存在する行を一覧表示')?['body/value']?[2]?['(列名)']))

この式では、or 関数を使用して2つの条件を組み合わせています。最初の条件は1行目が空であるかを、2番目の条件は3行目が空であるかをチェックしています。いずれかの条件が True であれば全体の結果も True となります。

おっと、これは特定行数を関数で指定してるじゃん、ということで、「例えば、何行あるか不明であり、上から確認したい場合はどのようにPower Automateを設定すべきでしょうか?条件だけではなく、ループ設定も必要ですか?」と質問し、更にこの時点での回答だとTeamsに複数送信される内容だったので、「空の列が複数あった場合、Teamsメッセージが何通も送信されてしまいませんか?複数の空の列があっても、メッセージは1回送信にしたいです」と追加で訊いてます。ここにきてやっとこさ、変数設定という超大事なことにたどり着いたのでした。なんとも長い道のりだった。

 

作った最終的なフローは以下の通り。

トリガーの設定(今回は1日1回時間指定でチェックする設定にした)
↓
「変数を初期化する」のアクションを追加。種類は「ブール値」初期状態を「false」に設定
↓
「Excel Online 表内に存在する行を一覧表示」で該当テーブル選択
 ※追記:他にもワークシートの取得やらテーブルの取得もあるんですが、「表内の〜」だとテーブル名まで指定できたのでこれにした
↓
「Apply to each」で「動的なコンテンツ」→一つ上で設定した「表内に〜」を選択。ここでの関数?はoutputs('表内に存在する行を一覧表示')?[body/value']になる。
↓
「Apply to each」内で条件設定
1)変数がfalseであること かつ
2)empty(Item['(判定したい列名)'])がTrue
これらがTrueの時にTeamsへメッセージ送信設定。Falseの時は何もしない(何も設定しない)

Excel Onlineがビジネス用なので、自宅の環境で再現できず、故に画像が一つもなくてすみません。とりあえず、今回の一苦労を通して実感したのが「フロー図ちゃんと書いてからじゃないとあかん」ということ。今回は「どうもエクセルからのデータの取り方が悪いのでは?」「条件がemptyだけではぼんやりし過ぎているのでは?」というのに気がついたから軌道修正できたものの、思いつかなかったら、この件あと20時間くらい悩んでそうよ、私は。あと「基本情報技術者試験勉強してて良かったー!」というのも、もう一つ実感したこと。あの泣きそうだったアルゴリズム(科目B)。あれを勉強したおかげで「変数に初期値を設定して…」という解決方法を理解できたのでした。まぁ、最初から出てくるようにしとけよという話ではありますけれどもね。

プロの皆さんからすれば、ずいぶんまぁ初歩的なところでコケたのねぇ、って感じかもしれませんが、折角なので記事にしました。お粗末さまでした。

References

References
1 もちろん同期すればデスクトップ版でも問題ないでしょうが、自分だけならまだしも今後他の人たちが共同所有者になったときに、やれ同期をしとけ、など指示したり、そのやり方をフォローしたりするのはメンドイなと思ったのだ。
2 とかるーく書いてますが、実際はempty関数は「true」に等しい、と条件設定しないとダメだとか、まぁ色々ありました。

Leave a Reply