PowerAutomateDesktopでGitHubのリポジトリからCollaborator一覧をExcelに出力する

ちょっとGitHubのOrg内のRepoを整理する必要があり、リポジトリの一覧とそれの関係者（Collaborator）の一覧をExcelに出力したいと思いました。

ちゃんとプログラム作った方が楽なのかもしれませんが、Winodwsユーザーなら無料になったPowerAutomateDesktop（以下PAD）を使ってノンコードでできないかなと思ったのでやってみました。
初めてPADの処理を作りましたので、変なとこがあるかもしれません。

無料になったぞという記事↓
https://blogs.windows.com/windowsexperience/2021/03/02/download-power-automate-desktop-for-windows-10-to-automate-tasks-and-processes-at-no-additional-cost/

# 準備編
### GitHubのToken取得
まずはGitHubのAPIトークンの取得です。

scopeは `repo` を指定してください。
[ここ]("https://github.com/settings/tokens/new")からAPIトークンを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125084/3df3a04d-8f04-0a1b-d414-fa8752a6ab5b.png)

できたトークンはコピーして保持しておいてください。

### Postmanで対象Orgのリポジトリ一覧を取得
ここもPADでやればよかったんですが、さすがにめんどくさそうだったのでちょちょっとPostmanでやりました。

PostmanのリクエストのAuthorizationのところで `OAuth 2.0` と設定してAccess Tokenに先ほどのトークンを貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125084/0d22ad94-9081-38ab-1cc2-831316f92818.png)
その後にRequestURLに `https://api.github.com/orgs/{orgの名前}/repos?per_page=100` を指定してsendします。
GiTHubのAPIのリファレンスは下記を参照ください。
https://docs.github.com/en/rest/reference/repos#list-organization-repositories

デフォルトでは30件までしか返してくれないので`per_page=100`をパラメーターにつけてます。
それ以上の場合はResponseのHeadersのLinkに「続きがあるぞ」って教えてくれるので`page=2`とかを追加して全件取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125084/8014e813-8e8f-6b7d-d809-c827c3d0301f.png)

結果を全部くっつけた後、レスポンスのcollaborators_url部分は`"https://api.github.com/repos/[orgname]/[reponame]/collaborators{/collaborator}"`となっているので、`{/collaborator}`を空に一括置換します。
それをjsonファイルとして保存しておきます。

### 書き込み先Excel用意
こんな項目を持ったExcelファイルを用意しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125084/1b24ec3e-f202-0c6c-7f48-57565e6c64cf.png)

# 実装編
ここからPADの実装です。
まずは全容をご覧ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125084/1e593cba-0e7d-5bfb-a7f8-fc100635f23a.png)

## 解説
1. ファイルからテキストを読み込む  
先ほど準備したjsonファイルを読み込みます。
1. JSON をカスタム オブジェクトに変換  
読み込んだテキストをオブジェクトに変換します。
1. Excel の起動  
用意したExcelファイルを起動します。
1. 変数の設定  
Excelに出力する行を指定するためのカウント変数を用意します。
1. 新しいリストの作成  
ここは結構ポイントです。GitHubのAPIを呼び出すリクエストを指定する際にHTTP Requestのヘッダーを指定する必要がありますが、その項目が複数ある場合はリストを作ってそれを入れてあげるないといけません。   
そのため、まずは空のリストを定義します。
1. 項目をリストに追加  
まずは認証情報を設定します。先ほど定義したリストに`Authorization:Bearer 0cf5XXXXXXXXXXXXXXXXXXXXXX`のようにAPIトークンを設定します。
1. 項目をリストに追加
続いて形式を指定します。`Accept:application/json`と設定します。これでヘッダーに設定するリストができました。
    1. For Each  
Jsonの項目分ループします。   
    1. 変数を大きくする  
カウントを1ずつアップします。
    1. Excel ワークシートに書き込み  
まずは1列目にIDとして件数を書き込みます。対象の行は`%loopCount + 1%`となります。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125084/c8ea71eb-8221-4f71-b0fc-50c1a8a9a156.png)
    1. Excel ワークシートに書き込み  
続いて2列目にリポジトリの名前を書き込みます。書き込む内容はJsonの中の"name"項目のため設定内容は`%CurrentItem.name%`とします。
    1. Excel ワークシートに書き込み  
3列目にExcelから直接リポジトリに飛べるようにURLを書き込みます。`%CurrentItem.html_url%`と指定します。
    1. Web サービスを呼び出します  
ここでGitHubのAPIを呼び出します。
URLにはループしているアイテムのURL部分を指定したいので`%CurrentItem.collaborators_url%`と指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125084/122da407-9fa1-2331-5308-ac0761c61d94.png)  
と、ここまで書いて気付きましたが、Webサービス呼び出しの設定で「受け入れる」のところを`application/json`にすればわざわざヘッダーにリストを設定する必要なさそうです…  
まぁいつか複数のヘッダー項目を指定する必要がある際の知見としてそのままにしておこう…   
~~ドヤ顔で「ポイントです」とか言ってて恥ずかしい~~
    1.  変数の設定  
コラボレーターを格納するための変数の初期値を`'`で指定します。  
※ 空文字を指定したかったけど、エラーになってしまった。誰か変数に空文字を設定する、もしくはクリアする方法があったら教えてください。。。
    1. If `%WebServiceResponse%` 空でない then  
誰もコラボレーターが設定されていないケースもあるため空判定して空じゃなければ後続の処理に進みます。  
        1. JSON をカスタムオブジェクトに変換  
レスポンスはテキストなのでオブジェクトに変換しておきます。  
        1. For each `%CurrentItem2%` in `%JsonAsCustomObject2%`  
レスポンス分ループします。  
            1. Switch `%CurrentItem2.login%`  
GitHubのOrganizationに対してOwner権限がある場合は全リポジトリのコラボレーターに設定されるため、それを除外するためのSwitch文です。
もっとうまいやり方あるのかもしれませんが、今回はそんな人数もいないためCaseでOwner権限のユーザーloginを指定してどれにも当てはまらなければ変数に`%collaborators%%CurrentItem2.login%,`を指定します。（前までの情報+今回のアイテム+`,`）  

        1. Excel ワークシートに書き込み  
4列目に作り上げた`%collaborators%`を書き込みます。  

以上で完成です。

## 実行
「実行」ボタンから実行するとExcelが立ち上がり、みるみるウチにExcelが埋まっていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125084/99362564-4fe2-1a96-0e67-64d204ccc3ed.png)  
件数も多く、実行時間は30分くらいかかってしまいましたが、なんとか目的を達成することができました。  
感動！
# まとめ  
はじめてPADを使ってみましたが、思った以上にすんなりいきました。
ただ、Jsonの子項目の指定が`%変数名.子項目名%`にしないといけないとか、簡易的に足し算をする時に`%`の中に計算式入れていいとか（例：`%loopCount + 1%`)がうまく調べられなくて色々試行錯誤してできました。  

これからも色々試してみたいと思います。