Power Automate Desktopで河川水位データを自動的に取得する

Excel

別稿で、URLで場所や日時を指定できるWebサイトから気象データを自動的に取得する方法を説明しました。しかし、Webページ上で場所や日時を指定しなければならないWebサイトも多くあります。そのようなサイトからできるだけ簡単にデータをExcelに取得する方法を説明します。

例としたWebサイトは某自治体の河川水位情報サイトです。サイト利用規約にはデータの著作権や利用制限について明記されていませんでしたので、サイトを特定できる情報は削除したりボカシを入れています。皆さんの利用したいサイトに読み替えてくださいね。また、対象サイトに過度な負荷をかけないよう、良識をもって利用しましょう。

本記事はPowerAutomate v2.26以前、v2.27以降の両方で動作確認しています。

ページ内で日時を指定しなければならないWebサイトの例

下図は水位データが表示されるサイトです。指定したある時間から過去24時間の10分間隔データ、または過去48時間の1時間間隔データが表形式で表示されます。

水位データを表示するWebサイト例
水位データを表示するWebサイト例

URLは図下部に一部省略して掲載しています。気象庁データと異なり、URLには地点を表す情報しか含まれていません。もともと最新のデータをリストするためのページなのでしょう。過去のデータが欲しいなら、ページ右上のドロップダウンを使って日時の情報を入力してやらなければなりません。

Power Automate DesktopでWebページを自動操作

Power Automate Desktopの入手法

Webページを操作する方法としては、Python + Seleniumがオーソドックスかと思いますが、素人には敷居が高いです。本稿では、Windows11に標準実装され、Windows10でもMicrosoft Storeから無料ダウンロードできる自動化ツール、Desktop版Power Automateを使った例を示します。

なお、Office365/Microsoft365にはWeb版Power Automateが付属しますが、こちらでの実行可能性については未検証です。Desktop版もWeb版も、ソフトウェア実行画面には単にPower Automateと表記されているようですのでお間違えなきよう。また、2022年12月時点ではDesktop版はmacには残念ながら対応していません。

本稿のスクリーンショットはWindows10版で作成しました。Windows11と表記が異なるところがあるかもしれませんのでご注意ください。

Desktop版Power Automateの自動実行の概要

下図はDesktop版Power Automateのプログラム・実行画面です。左側のアクションリストから自動化する操作を選び、中央にドロップすることでフローを構築します。ドロップするときに各種パラメータを設定できます。右側にはプログラム中で使用される変数がリストされています。中央上部赤枠の「実行」をクリックするとフローが実行され、下図ではExcelにデータが抽出されています。

Power Automate Desktopのプログラム画面と実行結果
Power Automate Desktopのプログラム画面と実行結果

河川水位データを読み取るフローの全体像

フローの部分を拡大して下図に示します。1から14のアクションで構成されています。アクションの内容は図中に示されていますので、全部を改めて説明するはないと思います。アクション3でラジオボタンを60分間隔に設定し、アクション4、5でデータ取得最終時刻を24時00分に設定し、アクション6、7でデータ取得年月を2020年01月に設定しています。アクション8から14のループで1日から30日まで2日間隔(1回で48時間のデータが表示されるため)でデータを表示させ、Excelに貼り付けています。

河川水位を読み取るフロー
河川水位を読み取るフロー

アクション4,5,6,7を適切に設定すれば、その月のデータを一括してExcelに取り出すことができます。データを取り出す地点についてはURLに埋め込まれていますので、別の地点を対象にする場合には元のWebサイトでURLを確認し、アクション2のURLを書き換える必要があります。

なお、このフローではひと月が28日、29日、31日の場合の対処はしていませんので、1日分は手動で対応することになります。全自動化に挑戦するのも楽しそうですね。(ー>あんまり楽しそうだったので、全自動化しちゃいました!)

フロー構築操作全解説

Power Automateを起動し、新しいデスクトップフローの構築を開始する

Power Automateを起動し、ホームを表示すると下図が現れます。下部右側の「新しいフロー」をクリックします。

Power Automateホーム画面で+新しいフローを選ぶ
Power Automateホーム画面で+新しいフローを選ぶ

すると下図が現れるので、適当なフロー名をつけます。フロー名は後で変更できます。「作成」をクリックします。

フロー名の作成
フロー名の作成

すると、下図の空白のフローが表示されます。

ローが空白の状態
フローが空白の状態

「Excelの起動」アクションを追加

下図のように「Excelの起動」アクションを空白のフロー部分にドロップします。起動したExcelを示す変数はダイアログの下部にExcelInstanceと表示されています。この名前は変更することもできます。

Excelの起動
Excelの起動

「新しいChromeを起動する」アクションを追加

「新しいChromeを起動する」アクションを下図のようにフロー末尾にドロップし、データを取得したいWebページのURLを「初期URL:」ボックスにコピペします。起動したChromeを示す変数名は「Browser」ですね。

新しいChromeを起動する
新しいChromeを起動する

他のブラウザも選べますがSKラボでは動作確認していません。またそれぞれのブラウザにPower Automate ブラウザ拡張機能をインストールして有効化しておかなければなりません。通常はPower Automateをインストール/起動した時に実施しているはずですが、動作しない時には念のために各ブラウザの拡張機能メニューを確認してください。

「新しいページのラジオ ボタンを選択します」アクションを追加

下図のように該当アクションをフローの末尾にドロップし、2番目のパラメータ「UI要素」のボックス右端の①vマークをクリックします。ここまでの作業でまだ一度もWebページの要素に対して操作していませんので、「表示するUI要素はありません」と表示され、②「UI要素の追加」ボタンが表示されますのでクリックします。

すると下図右のように「UI要素ピッカー」ダイアログが現れます。Chromeでクリックしたいラジオボタンの上にマウスを移動すると、③ラジオボタンが赤く選択されますので、ダイアログの指示通りControl + 左ボタンをクリックします。すると下図下のようにUI要素に値が設定されます。

ラジオボタンを60分間隔に設定する
ラジオボタンを60分間隔に設定する

1日の最後のデータとなる時刻を設定

「Webページでドロップ ダウン リストの値を設定します」アクションをフローの末尾にドロップします。UI要素ボックス右端の①vをクリックすると、一つ前に選択したUI要素がリストされていますが、②「UI要素の追加」ボタンをクリックしましょう。

すると再びUI要素ピッカーが現れますので、Webページ右上の③時刻ボックスにマウスを合わせ、赤く選択されたらControl + 左クリックします。

次に、「操作:」ボックスでは「インデックスを使ってオプションを選択します」を選び、「オプション インデックス:」ボックスには25を入力します。インデックスとは、ドロップダウンリストの1番目から0, 1, 2…と付けられています。ですので、25はリスト最終の24時を示しています。

ドロップダウンに最終時刻を設定
ドロップダウンに最終時刻を設定

年の設定

時刻の設定と同じく「Webページでドロップダウンリストの値を設定します」アクションを使います。操作はほぼ同じですので下図ではアクションの選択やUI要素の選択部分を省いています。「操作:」ボックスでは時刻で用いたインデックスではなく、名前を使ってオプションを選択しています。名前は、ドロップダウンリストに記述されている文字列で、この例では2020です。これは数字ではなく文字列であることに注意してください。インデックスでも選択はできますが、インデックスと年度の対応関係を調べるより直接年を記述する方が簡単です。

年の設定
年の設定

月の設定

時刻の設定と同じく「Webページでドロップダウンリストの値を設定します」アクションを使います。操作はほぼ同じですので下図ではアクションの選択やUI要素の選択部分を省いています。「操作:」ボックスでは時刻で用いたインデックスではなく、名前を使ってオプションを選択しています。名前は、ドロップダウンリストに記述されている文字列で、この例では「01」です。これは数字ではなく文字列であることに注意してください。「1」だと違う文字列になりますのでエラーになります。インデックスでも選択はできます。考えてみてください。

月の設定
月の設定

ループの追加

「Loop」アクションをフローの末尾にドロップします。60分毎のデータでは2日分が一度に取得できるので、2日から30日まで2日間隔でループを回します。変数名は規定のものから「Day」に変更してみました。保存すると、LoopとEndの2つのアクションが作成されます。

ループの設定
ループの設定

日の設定(ループ内部1)

時刻の設定と同じく「Webページでドロップダウンリストの値を設定します」アクションを使い、LoopとEndの間にドロップします。下図ではUI要素の選択操作を省いていますが、「UI要素:」には日のドロップダウンリストを選択してください。「操作:」ボックスではインデックスでオプションを選択しています。オプションインデックスはループ変数Dayを使い、「%Day%」と入力します。ボックス右端の{x}をクリックすればリストから変数を選ぶこともできます。

日の設定
日の設定

「一覧を表示」ボタンを押す(ループ内部2)

「Webページのボタンを押します」アクションをループ内の最下部(Endの上)にドロップし、「一覧を表示」ボタンをUI要素に設定します。

「一覧を表示」ボタンを押す
「一覧を表示」ボタンを押す

Webページからデータを抽出する(ループ内部3)

「Webページからデータを抽出する」アクションをループ内最下部(Endの上)にドロップします。パラメータのダイアログの説明(赤囲み)にあるように、このダイアログが開いている間に、対象のWebページを表示させたChromeをクリックして最前部に表示させます。

「Webページからデータを抽出する」アクションダイアログ
「Webページからデータを抽出する」アクションダイアログ

すると、下図左側の「ライブWebヘルパー」ダイアログが現れます。この状態でChromeの上にマウスを持っていくと、マウスの位置に応じていろいろな要素が選択されますので、データが入ったTable全体が選択できる場所をマウスで探ります。この例では①付近のかなり微妙な位置にきた一瞬にTable全体が選択されましたので、右ボタンクリックします。すると②のようなメニューがポップアップするので、「HTMLテーブル全体を抽出する」を選びます。すると下図右側のように抽出されるデータが表示されるので、それでよければ「終了」をクリックします。

ライブWebヘルパーで抽出する位置を選択する
ライブWebヘルパーで抽出する位置を選択する

以上で、下図のようにアクションダイアログに抽出されるデータが表示されるので、「保存」します。抽出されたデータはDataFromWebPage変数に入ります。

データの抽出位置がダイアログに表示される
データの抽出位置がダイアログに表示される

Excelシートのデータを書き込む場所を見つける(ループ内部4)

Excelワークシートの空いている場所は、「Excelワークシートから最初の空の列や行を取得」アクションで簡単に見つけることができます。下図のように、見つかった場所はFirstFreeColumn(列), FirstFreeRowExcel(行)の2つの変数に代入されます。

Excelワークシートから最初の空の列や行を取得
Excelワークシートから最初の空の列や行を取得

Excelワークシートに書き込む(ループ内部5)

いよいよ最終段階。Excelワークシートに書き込みます。「Excelワークシートに書き込む」アクションをループ内最下部にドロップし、「書き込む値:」ボックスにWebぺージから抽出したデータが入っている変数%DataFromWebPage%を記入します。ボックス右端の{x}をクリックしてリストから選択しても良いです。

Excelワークシートに書き込む
Excelワークシートに書き込む

完成したPower Automateのフロー

下図が完成した状態です。実行ボタンですぐ実行できるはずです。今回は年月を変更するにはアクションを編集する必要がありますが、右側上部には入出力変数のボックスがありますので、自分で定義した入出力変数をアクションのパラメータに設定することでもっとスマートなフローをつくることもできるでしょう。サブフロータブもありますのでサブルーチン・関数的なものも作れそうです。ご自身で調べてもっと便利にしてください。 Have fun!

完成したPower Automateのフロー
完成したPower Automateのフロー

付録:結局、複数年度完全版作っちゃいました

Power Automateって、動き出すと楽しいんですよね!結局複数年自動取得バージョンも作ってしまいました。少し30日バージョンで使っていないアクションも含まれています。あまり詳しく解説しなくても、ここまで読み進んだ皆さんならできますよね!サブフローに分割して、できるだけわかりやすく作成したつもりです。Poswe Automateでは変数はすべてのサブフローで共有されるグローバル変数のようです。サブフローに引数はありません。

コアとなる2日分取得サブフロー SubTwoDays

これは30日バージョンのアクション9, 10, 11, 12, 13と同じです。

SubTwoDaysサブフロー
SubTwoDaysサブフロー

1月の日数ごとの取得サブフロー Sub_xxdays (xx=28, 29, 30, 31)

1月の日数が28日、30日の場合は簡単です。下図左側がそれです。1月の日数が29日、31日の場合は、下図右側のようにまず28日、30日分は取得した後、29日、31日以前2日分のデータを変数DataFromWebPageに取得し、重複する最初の24時間分のデータをループで1行づつ削除しています。もう少しスマートに後半部だけを抽出できれば良かったのですが、その方法が見つかりませんでした。

1月の日数に応じた取得サブフロー
1月の日数に応じた取得サブフロー

任意の1月分の取得サブフロー Sub_month

任意の1月のデータを取得するには、30日の月と31日の月を区別するほか、うるう年の判定をしなければなりません。そのための条件分岐や計算は、下図右上のようにしてみました。数値計算も論理計算も%で囲んだ中に式を書きます。

任意の一月分の取得サブフロー Sub_month
任意の一月分の取得サブフロー Sub_month

メインフロー

ここまでできればメインフローは簡単です。アクション1から5までは30日バージョンと同じです。繰り返しの変数は下図右のように%ではさんでリストを記述します。

メインフロー
メインフロー(右下の「サブフローの実行:」はボックス右端のドロップダウンをクリックしてSub_monthを選択する)

簡単でしょう?うるう年さえなければもっと簡単だったのにね。Have fun!

コメント

タイトルとURLをコピーしました