Power Automate Desktopで遊んでみた

# インセンティブ
1. Power Automate Desktopというものがtwitterで話題になっていたのを見て、「面白そう！」と思ったので。
2. Power Automate Desktopについての超初歩的な遊び方の記事がまだ少なかったので。

# 注意事項
「この記事を見てPower Automateで遊んでみた結果なんかいろいろ破損したりしたんだけど！」とか、そういうのは対応しかねます。

その辺は自己責任ということでよろしくお願いします。

# 目次
1. 今回作ったフローの概要
2. Power Automateで前準備
3. Power Automate Desktopで遊ぶ（本編）

#今回作ったフローの概要
<a id="anchor1"></a>
1. Power Automateでtwitterから画像のURLデータをGoogle Driveに格納する
2. Google Driveから落としてきたデータをもとに画像をまとめてローカルに保存する

なお、今回はPower AutomateとPower Automate Desktopに簡単に触ることを目的としているため、最初から最後まですべて自動化されているわけではありません。加えて、その目的ゆえに結構回りくどいことをしています。悪しからず！

また、Power Automate Desktopの面白ポイントでもあるのですが、フローの中でJavaScriptを実行させます。この記事はJavaScriptを語るものではないので、その辺の説明は割愛させていただきます。悪しからず！（二回目）

# Power Automateで前準備
本題に入ります。
概要で述べた通り、まずPower Automateで前準備をします。
1からすべて自分で作るのもよいのですが、Power Automateには素晴らしいテンプレートがたくさんあるため、それを加工して作っていきます。
テンプレートの検索画面で「twitter」と打ち込んで…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/a993f133-cd3d-4b1e-6f6b-3e38dc9872c5.png)

実現したいフローに近いものを選択します。今回は以下の通り、「Twitterの投稿画像をPinterestに追加する」を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/0515547d-774d-41bd-237b-8eb10ffd8995.png)

選択すると接続先を追加するように言われました。
Pinterestは今回使いませんが、追加しないと先に進めませんので、素直に追加。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/e2f068be-ecae-e483-4bb2-35b42192728c.png)

続行を押下すると、以下のようなフローが表示されました。ここからPinterestのCreate pinの部分を削除して、目的のフローに書き換えていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/aef53c87-7d1d-5cc0-1ad4-7018f3e283e0.png)

Create pinを削除した後、アクションの追加を押下すると検索画面が出てきました。
テキストボックスに「Drive」と打ち込むと、お目当てのGoogle Driveが出てきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/fb6a9f79-d027-9871-45a6-76f7f7202404.png)

Google Driveのアイコンを押下すると、なんか色々出てきます。画像のURLをフォルダ内に追加していきたいので、「ファイルの作成」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/04f293fa-2421-9b37-d8c4-e7dc660e0e60.png)

ここで、予め作成しておいたGoogle DriveのPADというフォルダーをパスに指定します。フォルダーの名前は何でもいいです。
ファイル名は、ツイート内容などを選択してしまうと、出力ファイルに勝手に拡張子がついてしまうことがあり面倒なので、ツイート作成者（＝ユーザーID）を指定しました。
ファイルコンテンツはApply to eachに対して以前の手順から出力されているメディアURLを指定するため、現在のアイテムとしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/a0117966-df26-e58a-e059-288207fb86d7.png)

これで準備完了です。右上の「テスト」を押下して動作の確認をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/0a5cac36-eeaf-6c7f-02d7-9c08223d83fc.png)

実行履歴を確認する限り、正常に動作しているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/e8fb7257-9fac-65a3-f12a-9f8ffa75921d.png)

念のため、出力先に指定したGoogle Driveのフォルダーも見ておきます。
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/546da6a6-daba-e536-3e13-efa6250de207.png)
ちゃんとできていました。（ファイル名にツイート作成者を指定したので伏せています。）
あとはほっとけば順次ファイルが増えていきます。
これでPower Automateでの前準備は完了です。

# Power Automate Desktopで遊ぶ（本編）
ここからが今回の主人公、Power Automate Desktopの出番です。
Power Automate Desktopにやってもらうことは以下の通りです（再掲）

- Google Driveから落としてきたデータをもとに画像をまとめてローカルに保存する

作成したフローは以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/ccbcfd5a-2184-61bd-69c3-3b3421be1ad0.png)

上から順番に説明していきます。

と、その前に、Power Automate Desktopに処理をしてもらうためには先ほどのPower AutomateでのフローでGoogle Driveに出力されたデータを人力でzipで落としてくる必要があります。
GASをうまく使えばここも自動化できそうですが、今回はまぁよしとします。順当にダウンロードを押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/c68cd432-14c3-403d-e9d6-afe711dc3a2f.png)


- 1. PowerShell スクリプトの実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/a5848dda-70cf-ec68-d782-0d9c1ea845a3.png)

ここからが本題です。

ここでは、落としてきたファイルを解凍して生成されたフォルダを一度削除しています。
フローの実行時に前回のファイルが残っていると、必要のない画像までダウンロードされてしまうためです。

- 2. PowerShell スクリプトの実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/da6259d0-8fc5-0368-1413-42aa66eba3a8.png)

ここでは、DLしてきたZIPファイルを指定のパスに解凍しています。
解凍に成功すると、resolved配下にPADというフォルダが生成され、その中にtwitter画像のURLデータが書き込まれたファイルが格納されます。

- 3. フォルダー内のファイルを取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/469f5c09-9145-d779-2971-3fb0dbf5f281.png)

ここでは、ひとつ前の手順で格納されたファイルを取得しています。
取得されたファイルは変数Filesに格納されます。

- 5. テキストのトリミング

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/44a03fe9-94af-7138-ca74-5c401f8f9211.png)

ここからは、for Eachに入ります。
ここでは画像の通り、先頭と末尾の空白文字をトリムしています。
これをやらないとちゃんと動きません。

- 6. ファイルからテキストを読み取る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/c6c1d85f-f19e-8496-1b98-ef68dd8e2255.png)

ここでは、「3. フォルダー内のファイルを取得」で取得したファイルの中身からテキスト＝画像URLを読み取ります。
URLは変数FileContentsに格納されます。

- 7. 新しいChromeを起動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/cf6bb5b8-e1cd-d3a5-e8f6-3172f19e0d81.png)

ここで、Chromeを立ち上げます。URLにはひとつ前の手順で格納したFileContentsを指定します。

- 8./9./10. WebページでJavaScript関数を実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/3cb891ca-c539-8e15-d630-7cdb89eb47b4.png)

```js:sample
function downloadImage() {
    const src = document.getElementsByTagName("img")[0].getAttribute("src");

    let xhr = new XMLHttpRequest();
    xhr.open('GET', src, true);
    xhr.responseType = "blob";
    xhr.onload = downloadImageToLocal;
    xhr.send();
}

function downloadImageToLocal() {
    const link = document.createElement('a');

    let dlLink = document.getElementsByTagName('img');
    const dataUrl = dlLink[0].src;
    link.href = dataUrl;

    const fileName = 'image.jpeg';
    link.download = fileName;

    link.click();
    link.remove();
}

downloadImage();
```

↓こちらの記事を参考にさせていただきました↓

https://r17n.page/2020/01/12/js-download-image-to-local/

関数は一つのフローでまとめて書くことはできないため、ひとつずつフローに追加していく必要があります。

- 11. Webブラウザーを閉じる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/c24dc116-8305-3fb3-85c2-2da7b4df8976.png)

ダウンロードが終わったらブラウザーは閉じておきましょう。
ダウンロードするファイルが多い場合、後で閉じるのが大変です。

以上でフローの解説は終わりです。

# 作成したPADフローを実際に動かしてみる
それでは作成したフローを動かしてみます。今回は画像を2つだけダウンロードします。
実行時は左上の実行ボタンを押下するだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/f56b0b91-7738-a227-6f89-031a5b2d4946.png)

無事ダウンロードできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099491/690f0f26-18ce-1e89-452f-8ce41e41d61b.png)

# おわりに
記事の内容は以上となります。
Power Automate Desktop、面白いおもちゃという感じで、触ってるとめちゃめちゃ時間が解けます。
他にもたくさんの機能があるので、もっと触ってみてめんどくさい作業をパパっと自動化していきたいですね。
（GUI操作がメインでショートカットが少ないアプリケーションとかは自動化するのは難しそうですが。。。）

それでは、お読みいただきありがとうございました。