GPT-4君との合作。
コマンドプロンプトやVBSでも組んでみたが、PowerShellが一番安定して動作してくれた。特にJsonからの変換が簡単なのはありがたい。
downloadFromKintone.ps1
# カレントディレクトリをスクリプトファイルの場所へ移動
Set-Location (Split-Path $MyInvocation.MyCommand.Path -parent)
# kintoneのサブドメイン、APIトークン、アプリIDを設定
$subDomain = "サブドメイン"
$apiToken = "APIトークン"
$appId = "アプリID"
# 出力するファイル名を設定
$outputCsv = "C:\Temp\Output.csv"
# APIリクエストのヘッダーを設定
$headers = @{
"X-Cybozu-API-Token" = $apiToken
}
# 全レコードを取得
$allRecords = @()
$offset = 0
$limit = 500
do {
# APIエンドポイントを設定
$uri = "https://$subDomain.cybozu.com/k/v1/records.json?app=$appId&query=limit%20$limit%20offset%20$offset"
# APIリクエスト
$response = Invoke-RestMethod -Uri $uri -Headers $headers -Method Get
# レコードを結合
$allRecords += $response.records
$offset += $limit
} while ($response.records.Count -eq $limit)
# CSVに出力
$dataForCsv = @()
foreach ($record in $allRecords) {
$obj = New-Object PSObject
$obj | Add-Member -Type NoteProperty -Name 出力列名 -Value $record.'アプリのフィールド名'.value
# 以下出力したいフィールドを同様に記載
$dataForCsv += $obj
}
# 一時出力
$tempFile = "temp_output.csv"
$dataForCsv | Export-Csv -Path $tempFile -NoTypeInformation -Encoding UTF8
# Shift-JISで再保存
Get-Content $tempFile | Set-Content $outputCsv -Encoding "Default"
Remove-Item $tempFile
Write-Host "データの出力が完了しました。: $outputCsv"
コメント
GPT-4に書いてもらうとヘッダー指定のところに"Content-Type"の一文を入れてくれるが、これは動作しないので削除している。何か別の言語の情報と混じっているのか、あるいは環境によっては必要なのだろうか?
$headers = @{
"X-Cybozu-API-Token" = $apiToken
# 以下は削除
"Content-Type" = "application/json"
}
REST APIでは一度に500件までしか取得できないため、offsetで取得する行をずらして繰り返すことで500件を超えてる全レコードを取得するよう記載してもらっている。
# 全レコードを取得
$allRecords = @()
$offset = 0
$limit = 500
GPT-4の元のコードではURIで普通にスペースを使って記載していたので、これは%20に置き換えた。
# GPT-4が最初に書いたコード
$uri = "https://$subDomain.cybozu.com/k/v1/records.json?app=$appId&query=limit $limit offset $offset"
# スペースをURLエンコード
$uri = "https://$subDomain.cybozu.com/k/v1/records.json?app=$appId&query=limit%20$limit%20offset%20$offset"
CSVをShift-JISで出力させるのが当初上手くいかず、何度か修正してもらった結果この形になった。Defaultは通常Shift-JISなのでとりあえずこれで動作する。
# 一時出力
$tempFile = "temp_output.csv"
$dataForCsv | Export-Csv -Path $tempFile -NoTypeInformation -Encoding UTF8
# Shift-JISで再保存
Get-Content $tempFile | Set-Content $outputCsv -Encoding "Default"
Remove-Item $tempFile
コードに記載した列の順番とCSVに出力される列の順番が一致していなかったので、こちらも修正してもらった。
# GPT-4が最初に書いたコード
foreach ($record in $allRecords) {
$dataForCSV += New-Object PSObject -Property @{
Field1 = $record.Field1.value
Field2 = $record.Field2.value
}
}
# 修正後のコード
foreach ($record in $allRecords) {
$obj = New-Object PSObject
$obj | Add-Member -Type NoteProperty -Name 出力列名1 -Value $record.'アプリのフィールド名1'.value
$obj | Add-Member -Type NoteProperty -Name 出力列名2 -Value $record.'アプリのフィールド名2'.value
$dataForCsv += $obj
}
何はともあれ自分で一から作成するよりもはるかに早く済んだ。ありがとうGPT-4君。