2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

kintoneAdvent Calendar 2024

Day 14

【PowerShell】REST APIでアプリからデータ取得しCSVで保存する【kintone】

Posted at

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君。

2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?