LoginSignup
5
5

More than 3 years have passed since last update.

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

Posted at

ちょっと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 を指定してください。
ここからAPIトークンを作成します。
image.png

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

Postmanで対象Orgのリポジトリ一覧を取得

ここもPADでやればよかったんですが、さすがにめんどくさそうだったのでちょちょっとPostmanでやりました。

PostmanのリクエストのAuthorizationのところで OAuth 2.0 と設定してAccess Tokenに先ほどのトークンを貼り付けます。
image.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

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

書き込み先Excel用意

こんな項目を持ったExcelファイルを用意しておきます。
image.png

実装編

ここからPADの実装です。
まずは全容をご覧ください。
image.png

解説

  1. ファイルからテキストを読み込む
    先ほど準備したjsonファイルを読み込みます。
  2. JSON をカスタム オブジェクトに変換
    読み込んだテキストをオブジェクトに変換します。
  3. Excel の起動
    用意したExcelファイルを起動します。
  4. 変数の設定
    Excelに出力する行を指定するためのカウント変数を用意します。
  5. 新しいリストの作成
    ここは結構ポイントです。GitHubのAPIを呼び出すリクエストを指定する際にHTTP Requestのヘッダーを指定する必要がありますが、その項目が複数ある場合はリストを作ってそれを入れてあげるないといけません。
    そのため、まずは空のリストを定義します。
  6. 項目をリストに追加
    まずは認証情報を設定します。先ほど定義したリストにAuthorization:Bearer 0cf5XXXXXXXXXXXXXXXXXXXXXXのようにAPIトークンを設定します。
  7. 項目をリストに追加
    続いて形式を指定します。Accept:application/jsonと設定します。これでヘッダーに設定するリストができました。

    1. For Each
      Jsonの項目分ループします。
    2. 変数を大きくする
      カウントを1ずつアップします。
    3. Excel ワークシートに書き込み
      まずは1列目にIDとして件数を書き込みます。対象の行は%loopCount + 1%となります。  image.png
    4. Excel ワークシートに書き込み
      続いて2列目にリポジトリの名前を書き込みます。書き込む内容はJsonの中の"name"項目のため設定内容は%CurrentItem.name%とします。
    5. Excel ワークシートに書き込み
      3列目にExcelから直接リポジトリに飛べるようにURLを書き込みます。%CurrentItem.html_url%と指定します。
    6. Web サービスを呼び出します
      ここでGitHubのAPIを呼び出します。 URLにはループしているアイテムのURL部分を指定したいので%CurrentItem.collaborators_url%と指定します。 image.png
      と、ここまで書いて気付きましたが、Webサービス呼び出しの設定で「受け入れる」のところをapplication/jsonにすればわざわざヘッダーにリストを設定する必要なさそうです…
      まぁいつか複数のヘッダー項目を指定する必要がある際の知見としてそのままにしておこう…
      ドヤ顔で「ポイントです」とか言ってて恥ずかしい
    7. 変数の設定
      コラボレーターを格納するための変数の初期値を'で指定します。
      ※ 空文字を指定したかったけど、エラーになってしまった。誰か変数に空文字を設定する、もしくはクリアする方法があったら教えてください。。。
    8. If %WebServiceResponse% 空でない then

      誰もコラボレーターが設定されていないケースもあるため空判定して空じゃなければ後続の処理に進みます。

      1. JSON をカスタムオブジェクトに変換
        レスポンスはテキストなのでオブジェクトに変換しておきます。
      2. For each %CurrentItem2% in %JsonAsCustomObject2%
        レスポンス分ループします。
        1. Switch %CurrentItem2.login%
          GitHubのOrganizationに対してOwner権限がある場合は全リポジトリのコラボレーターに設定されるため、それを除外するためのSwitch文です。 もっとうまいやり方あるのかもしれませんが、今回はそんな人数もいないためCaseでOwner権限のユーザーloginを指定してどれにも当てはまらなければ変数に%collaborators%%CurrentItem2.login%,を指定します。(前までの情報+今回のアイテム+,
      3. Excel ワークシートに書き込み
        4列目に作り上げた%collaborators%を書き込みます。

以上で完成です。

実行

「実行」ボタンから実行するとExcelが立ち上がり、みるみるウチにExcelが埋まっていきます。
image.png

件数も多く、実行時間は30分くらいかかってしまいましたが、なんとか目的を達成することができました。

感動!

まとめ

はじめてPADを使ってみましたが、思った以上にすんなりいきました。
ただ、Jsonの子項目の指定が%変数名.子項目名%にしないといけないとか、簡易的に足し算をする時に%の中に計算式入れていいとか(例:%loopCount + 1%)がうまく調べられなくて色々試行錯誤してできました。

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

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5