はじめに
この記事の概要
- kintoneにはcsvでレコードを一括更新する機能が備わっていますが、プロセス管理を有効にした際の「現在の作業者」を一括更新する手段がありません。
- 例えばあるアプリの作業者に組織を指定している場合、あとから組織に追加されたユーザーは既存のレコードの「現在の作業者」としては自動的に追加されてくれません。
- そこで既存のレコードの「現在の作業者」を一括で更新したいと考えますが、唯一の一括更新手段であるcsv読み込みでは「現在の作業者」を更新できません。(ちなみに「ステータス」も同様)
- JavaScriptを駆使すればkintone APIを通して一括更新できますが、たった一度の作業のためにいちいちコードを書きたくない・・・というようなシーンでお役に立てる記事かと思います。
- kintoneの仕様については、執筆時点 (2023/04/17) のものに従いました。
ご利用は自己責任でお願いいたします。
想定している読者
- kintoneのレコードについて、「ファイルを読み込む」で更新できない項目を一括更新したい人
- HTTP周辺の用語をある程度理解している人
用意するもの
-
Postman
- この記事ではWindows版 v10.12.13を利用しています。
手順
0. kintone側 (事前確認・準備)
0-1. 権限の確認
- 今回はPostmanを利用してAPIでkintoneのレコードを更新しますが、そもそも更新に利用しようとしているユーザーが対象のアプリについてkintoneのレコード編集権限を付与されているか確認してください。
0-2. 更新対象レコード情報の取得
- 一括更新したいアプリから、更新対象のレコードの「レコード番号」をファイルに書き出してください。
1. Postman側
1-1. 起動
- 事前準備・確認が終わったらいざPostmanの操作に移ります。起動すると下記の画面が表示されます。
- そもそもアカウントをもっていないという方は [Create Free Account] でアカウントを作成するか、左下の [Skip and go to the app] をクリックしてアカウントなしで進みましょう。
- サインインするかアカウント作成をスキップすると、下記のような画面が表示されます。
1-2. Collectionの作成
- まずは左メニューの [Collections] が選択された状態で、左上の [+] ボタンをクリックまたは [Create Collection] のリンクをクリックしてCollectionを作成します。
1-3. requestの作成
-
続いて、実際にkintone APIにアクセスするためのrequestを作成しましょう。
-
名称はやはり任意ですが、ここでは「update assignees」としておきます。
-
まずリクエストメソッドを「GET」から「PUT」に変えておきましょう。
- なおレコードの作業者を更新するAPIを利用します。
-
URLは「https://{サブドメイン}.cybozu.com/k/v1/record/assignees.json」です。
-
また、[Headers] に次の値を設定します。
- X-Cybozu-Authorization:ログイン名:パスワード
を Base64 エンコードした値
-
仕上げに、[Body] を作成します。
- [Body] から「raw」を選択し、以下を入力します。形式が「Text」になっている場合は「JSON」を選択してください。(下記画像の「JSON」になっている箇所)
{
"app": 451,
"id": {{レコード番号}},
"assignees": [
"test",
"hoge"
]
}
- 簡単に解説しておくと、それぞれ以下の通りの意味です。
- app:対象となるアプリID
- id:0-2. で出力した「レコード番号」を代入するための変数
- assignees:作業者 (ログイン名) の配列
- 特に注意が必要なのは [assignees] で、「現在の作業者」がこの値の通りに上書きされます。追加ではないことに注意してください。
そんなニーズは滅多にないと思いますが、このAPIでは100を超える作業者を設定できません。その場合は手動で更新するより他ないと思います。
1-4. Testsの設定
- ここまでで一括更新の準備はほとんど終わりましたが、最後に念のためTestsの設定をしておきます。
- これは実行結果が成功したか失敗したかを視認しやすくするための設定です。
- そんなに厳密にテストしたいわけではないので、下記くらいを設定しておきます。
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
pm.test("Body has revision", function () {
pm.expect(pm.response.json()['revision']).to.match(/[0-9]+/);
});
- ここでは細かく解説しませんが、興味のある方は公式サイトにて確認してください。
- それぞれ、「レスポンスのステータスが200であること」「レスポンスに『revision』が含まれ、その値が数値であること」をテストしています。
1-5. Collectionの実行
-
最後にいよいよCollectionの実行です。
-
左側の「kintone bulk update」をマウスオーバーして表示されるメニュー [...] から、 [Run Collection] をクリックします。
-
すると [Runner] タブが表示されますので、それぞれ次のように入力・選択します。
-
Delay:100ms (任意の値)
- 各リクエスト間の間隔です。行数が多い場合はkintoneに負荷をかけないよう、500msなど大きめの数字にしておきます。(その分全体の実行時間は長くなってしまいますが。)
-
Data:0-2. で出力したcsvファイル
-
ではいよいよ [Run kintone bulk update] ボタンをクリックして処理を開始してみましょう。
-
今回は5レコードに対して一括処理を実行したので、[Passed] が (10) ですべて成功していることがわかります。 (1レコードにつきテスト2つ設定しているため 2*5=10)
-
ちなみにリクエストが失敗した場合は下記のように「Fail」の文字とエラーメッセージが出力されるので、解析して再実行します。
2. 結果
3. 最後に
- この方法を使えば、ステータスの一括更新も可能です。
- 0-2. で更新対象レコードを抽出しますが、抽出後に他のユーザーがレコードを更新した場合、一括更新で意図しない結果になる可能性があります。
- その場合はレコードのリビジョン番号を指定して更新すれば意図しない更新を避けることができます。
- ただしリビジョン番号の取得にはひと手間必要ですので、一括更新作業の際は可能であればそのアプリの利用を一時止めてもらうという方が現実的かも知れません。
- リビジョン番号を指定する場合、Postmanのrequestには下記を指定します。
- csvの方には「リビジョン番号」列が必要になります。kintoneの「ファイルに書き出す」では出力されませんので、複数のレコードを取得するAPIなどで取得する必要があります。
{
"app": 451,
"id": {{レコード番号}},
"revision": {{リビジョン番号}},
"assignees": [
"test",
"hoge"
]
}
以上。