背景
副業でkintoneを使った業務支援を行っている中で、社内システムで管理している各種マスタをkintoneと同期して欲しい(kintone上で業務データを生成する上で社内システムのマスタを使えるようにしたい)というご要望をいただきました。
マスタはWebアプリとWindowsフォームアプリの2種類あって、そこからデータを吸い上げるためにPowerAutomateを間に挟んでcsvでデータ化して、そのcsvデータをkintoneにリクエストするという構成にしました。
(ワンチャンうまく行かなかった場合の撤退コストを考慮し、サーバーなどは用意せず、クライアントPCで動かせる方式で構築したかった)
PowerAutomateの「Webサービスを呼び出します」で実装しろよって話なんですが、うまく疎通できなかったため(スピード勝負だったので深追いもせず)、実装はPowerShellに寄せることにしました。
やりたいこと
- 検索、追加、更新、削除を実装する
- 10000件問題を回避する
- 複数レコードを一括更新できるようにする(APIコール数制限、オーバーヘッド低減)
いざ実装
レコード一括取得処理はこんな感じです。
class KintoneApi {
# kintoneのベースURL
[string] $URL = 'https://your-domain.cybozu.com';
# レコード一括取得API(検索条件指定あり)
[array] GetKintoneRecords($app, $fields, $headers, $customQuery){
$URI = "/k/v1/records.json"
$Uri = $this.URL + $URI
# 検索結果の一番大きなレコード番号を設定する変数
# 繰り返し検索する際の起点として利用する
$lastRecordId = 0;
# 検索結果を格納する配列
$records = @();
$Report = @();
# 1度の検索上限数
$getLimitSize = 500;
try {
Log "Start GetKintoneRecords."
while($true) {
$query = 'レコード番号 > ' + $lastRecordId + ' order by レコード番号 asc limit ' + $getLimitSize;
# 検索条件が指定されている場合は設定する(andで結合)
if (-not ([string]::IsNullOrEmpty($customQuery))){
$query = $customQuery + ' and ' + $query
}
$body = @{
app = $app
query = $query
fields = $fields
totalCount = 'true'
}
$Report = Invoke-RestMethod -Method Get -Uri $Uri -Body $body -Headers $headers
for ($i=0; $i -lt $Report.records.Length; $i++){
$records += $Report.records[$i]
$lastRecordId = $Report.records[$i].レコード番号.value # レコード番号の昇順で検索しているので、最後のレコード番号を次の検索の起点にセットする
}
# getLimitSize以下になるまで検索を繰り返す
if ($Report.records.Length -lt $getLimitSize) {
break
}
}
} catch {
Log ($_.Exception)
Log (ConvertErrorMessage($_.Exception))
} finally {
Log 'End GetKintoneRecords'
}
return $records;
}
}
呼び出しはこんな具合に。
$KintoneApi = New-Object KintoneApi
$records = $KintoneApi.GetKintoneRecords($ID, $fields, $headers, $null)
for ($i=0; $i -lt $records.Length; $i++){
$val1 = $records[$i].フィールドコード1.value
}
上記以外にも1件検索、追加、更新、削除を実装しております。
https://github.com/koguren/powershellKintoneAPI.git
ご興味ある方&ここの書き方こうするともっといいよ!とコメントいただける方いらっしゃればよろしくお願いいたします!
その他
いざお客さんマシンで動かそうと思いきやpowershell実行にあたりExecutionPolicyの設定にハマりました(何事も勉強ですね!)。冷や汗ものでした。