📊
GitHubのIssueをPowerShellでCSVファイルにエクスポートする方法
解法
GitHubのIssueをCSVファイルにエクスポートするPowerShellスクリプトを作成しました。このスクリプトを使用することで、指定したリポジトリのオープンなIssueを簡単にCSVファイルに出力できます。
以下のスクリプトを Export-GitHubIssues.ps1
のようなファイルに保存し、実行してください:
param(
[Parameter(Mandatory=$true)]
[string]$Owner,
[Parameter(Mandatory=$true)]
[string]$Repo
)
# モジュールのインストール確認と必要に応じてインストール
if (-not (Get-Module -ListAvailable -Name PowerShellForGitHub)) {
Write-Host "PowerShellForGitHub モジュールがインストールされていません。インストールを開始します..."
Install-Module -Name PowerShellForGitHub -Force -Scope CurrentUser
}
# モジュールのインポート
Import-Module PowerShellForGitHub
# GitHub認証設定
# 環境変数からトークンを取得、なければコンソールから入力を求める
$token = [System.Environment]::GetEnvironmentVariable("GitHubToken", "User")
if (-not $token) {
$secureToken = Read-Host "GitHub Personal Access Tokenを入力してください" -AsSecureString
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureToken)
$token = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
# 入力されたトークンを環境変数に設定
[System.Environment]::SetEnvironmentVariable("GitHubToken", $token, "User")
Write-Host "トークンが環境変数 'GitHubToken' に保存されました。"
}
# トークンを使用して認証情報を設定
$secureString = ($token | ConvertTo-SecureString -AsPlainText -Force)
$cred = New-Object System.Management.Automation.PSCredential "username is ignored", $secureString
Set-GitHubAuthentication -Credential $cred
try {
# オープンなIssueの取得
Write-Host "リポジトリ $Owner/$Repo からオープンなIssueを取得中..."
$issues = Get-GitHubIssue -OwnerName $Owner -RepositoryName $Repo -State Open
# すべてのラベルを収集(重複を除去、bugとenhancementを除外)
$allLabels = $issues.Labels.Name | Where-Object { $_ -notin @('bug', 'enhancement') } | Select-Object -Unique | Sort-Object
# データの整形
$formattedIssues = $issues | ForEach-Object {
$issue = $_
$labelNames = $issue.Labels.Name
$type = if ($labelNames -contains 'bug') { 'bug' }
elseif ($labelNames -contains 'enhancement') { 'enhancement' }
else { '' }
$labelColumns = @{}
foreach ($label in $allLabels) {
$labelColumns[$label] = if ($labelNames -contains $label) { 'x' } else { '' }
}
# 日付の処理
$createdAt = if ($issue.created_at) {
[DateTime]::Parse($issue.created_at).ToLocalTime().ToString("yyyy/MM/dd HH:mm:ss")
} else { "" }
$updatedAt = if ($issue.updated_at) {
[DateTime]::Parse($issue.updated_at).ToLocalTime().ToString("yyyy/MM/dd HH:mm:ss")
} else { "" }
# マイルストーン情報の取得
$milestone = if ($issue.milestone) {
$issue.milestone.title
} else { "" }
$baseProperties = [ordered]@{
'Number' = $issue.Number
'Title' = $issue.Title
'Created At' = $createdAt
'Updated At' = $updatedAt
'Assignee' = $issue.Assignee.Login
'Type' = $type
'Milestone' = $milestone
}
$combinedProperties = $baseProperties + $labelColumns
New-Object PSObject -Property $combinedProperties
}
# 出力フォルダの作成(存在しない場合)
$outputFolder = Join-Path $PSScriptRoot "out"
if (-not (Test-Path -Path $outputFolder)) {
New-Item -ItemType Directory -Path $outputFolder | Out-Null
Write-Host "出力フォルダを作成しました: $outputFolder"
}
# CSVファイルへの出力(Shift_JISエンコーディングを使用)
$outputFileName = "github_open_issues_$Repo.csv"
$outputPath = Join-Path $outputFolder $outputFileName
$formattedIssues | Export-Csv -Path $outputPath -NoTypeInformation -Encoding Shift-JIS
Write-Host "オープンなIssueが正常にCSVファイルに出力されました: $outputPath"
Write-Host "取得したオープンなIssueの数: $($formattedIssues.Count)"
}
catch {
Write-Error "エラーが発生しました: $_"
}
finally {
# 認証情報のクリア
Clear-GitHubAuthentication
}
解説
このスクリプトは以下の手順でGitHubのIssueをCSVファイルにエクスポートします:
- PowerShellForGitHubモジュールを使用してGitHub APIにアクセスします。
- 指定されたリポジトリからオープンなIssueを取得します。
- 各Issueの情報(番号、タイトル、作成日時、更新日時、担当者、タイプ、マイルストーン、ラベル)を整形します。
- 整形したデータをCSVファイルに出力します。
スクリプトの実行には、GitHubのPersonal Access Tokenが必要です。トークンは環境変数GitHubToken
に設定するか、初回実行時に入力を求められます。
使用方法
-
PowerShellForGitHubモジュールをインストールします:
Install-Module -Name PowerShellForGitHub -Scope CurrentUser
-
スクリプトを実行します:
.\Export-GitHubIssues.ps1 -Owner "オーナー名" -Repo "リポジトリ名"
-
出力されたCSVファイルは
out
フォルダ内に保存されます。
補足情報
- 出力されるCSVファイルはShift_JISエンコーディングを使用しています。必要に応じて変更可能です。
-
bug
とenhancement
ラベルは特別に扱われ、Type
列に出力されます。 - その他のラベルは個別の列として出力されます。
- マイルストーン情報も含まれています。
このスクリプトを使用することで、GitHubのIssue管理をより効率的に行うことができます。
Discussion