【kintone】JavaScriptの書き方(PUT API)【カスタマイズAPI編】

kintoneで他アプリのレコード情報を更新したいのですが、どのように実装すれば良いのでしょうか。

kintoneにおけるJavaScriptカスタマイズではREST APIが使えます。
PUT処理を行うことで他アプリのレコードを更新できます。

この記事ではAPIを使ったレコードの更新(PUT)処理について解説します。

この記事で何が分かる?
  • kintoneのJavaScriptカスタマイズでは、REST APIを使えます。
  • レコード情報を更新するには、PUT処理を行います。
  • PUT処理は2種類あります。
    ・1件更新する
    ・複数件更新する
  • リビジョンを指定することで、PUT実行前に第三者が更新した場合、自身の更新処理(上書き)をエラーにできます。
  • REST APIは非同期処理です。同期処理にするには「async/await」を使います。
目次

kintoneのレコード情報の更新(PUT)

kintoneでレコードを保存するや削除する時、同時に他のアプリのレコードを更新したいということはないでしょうか。

JavaScriptカスタマイズでは、REST APIのPUT処理を使えば、任意のタイミングで他アプリのレコード情報を更新できます。

更新できるレコードも1件だけではなく、複数件のレコードを一括更新できます。

1件更新する方法複数件更新する方法の両方をコードで解説します。

レコードを1件更新する

レコードを1件更新する場合は、アプリIDとレコードIDを使います。

以下のコードでは、レコード編集保存時に他アプリであるアプリID:119のレコードID:1を更新します。

(() => {

	'use strict';

	kintone.events.on(['app.record.edit.submit'], event => {

		const record = event.record;

		const params = {
			app: 119,		// アプリID
			id: 1,			// レコードID
			record: {		// レコード情報
				氏名: {
					value: [{ code: kintone.getLoginUser().code }]
				},
				内容: {
					value: record.対応内容.value
				}
			}
		};

		return kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', params).then((resp) => {
			// PUT成功
			alert('アプリ119のレコードを更新しました。');
			return event;
		}).catch((error) => {
			// PUTエラー
			console.log(error);
			event.error = 'エラーが発生しました。';
			return event;
		});

	});

})()

REST APIは非同期処理です。

即ち、APIを実行している間に、後続の処理が並列して実行されます。

例えば、レコード保存時や削除時にAPIを実行すると、その結果が返ってくる前に保存や削除が完了してしまいます。

そのため、保存完了を待つために、kintone.apiを「return」します。

これにより「Promise」を使った同期処理になります。

POST後の処理は「.then()」に続く関数内に記述します。

一方でPOSTがエラーの場合の処理は「.catch()」に続く関数内に記述します。

エラーの場合はレコードの保存をキャンセルしたいため、「event.error」を設定します。

エラーの書き方については以下記事でも解説しました。

レコードを複数件更新する

レコードを複数件更新する場合は、更新する件数分のレコード情報をパラメータとして渡します。

利用場面としては更新対象のレコードをGETした上でPUTすることが多いです。

以下のコードでは、アプリID:119に設置した参照元レコード番号(数値フィールド)の値が自レコードIDと一致するものをGETし、それらに対してPUT(内容を更新)します。

(() => {

	'use strict';

	kintone.events.on(['app.record.edit.submit'], async event => {

		const record = event.record;

		try {

			const getParams = {
				app: 119,	// アプリID
				query: `参照元レコード番号 = ${record.$id.value}`,	// クエリ
				fields: ['$id', '$revision']	// 取得フィールド
			};

			const getResp = await kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', getParams);

			const putRecords = getResp.records.map((getRecord) => {
				return {
					id: getRecord.$id.value,
					revision: getRecord.$revision.value,
					record: {
						内容: {
							value: record.対応内容.value
						}
					}
				};
			});

			const putParams = {
				app: 119,		// アプリID
				records: putRecords	// レコード情報
			};

			await kintone.api(kintone.api.url('/k/v1/records.json', true), 'PUT', putParams);

			alert('アプリ119のレコードを更新しました。');
			return event;

		} catch (e) {
			// PUTエラー
			console.log(e);
			event.error = 'エラーが発生しました。';
			return event;
		}

	});

})()

まずはクエリを使って条件を指定しGETします。

GETするフィールドは「$id(レコードID)」と「$revision(リビジョン)」とします。

GETしたレコード群は「map」を使って各レコードをループしつつ、更新用のレコード配列(putRecords)に追加します。

このとき、レコードID、リビジョン、フィールド情報をひとまとめにして配列に追加します。

この配列とアプリIDをPUT時のパラメータとします。

リビジョンは更新回数を指します。

GETしてPUTするまで、わずかに時間差があります。

その間に第三者がレコードを更新するかもしれません。

そうなると、リビジョン(更新回数)が一つ上がります。

リビジョンを指定せずにPUTした場合は、第三者が更新した後に、さらに上書きすることになります。

場合によっては、一つ前の古い情報で上書きしてしまうかもしれません。

それを防ぐために、GET時のリビジョンをパラメータとすることで、第三者が更新していなければ正常に上書きができ、仮に第三者が先に更新していれば、自身の更新処理をエラーにできます。

今回のようにGETしてPUTする場合は、リビジョンを指定する方が良いでしょう。

APIのURLは、複数件の更新の場合は「kintone.api.url(‘/k/v1/records.json’, true)」のように「records」である点に注意です。

先に述べた通り、REST APIは非同期処理です。

先ほどはkintone.apiを「return」することでPromise処理による同期処理としましたが、こちらは「async/await」を使いました。

この記事のまとめ
  • kintoneのJavaScriptカスタマイズでは、REST APIを使えます。
  • レコード情報を更新するには、PUT処理を行います。
  • PUT処理は2種類あります。
    ・1件更新する
    ・複数件更新する
  • リビジョンを指定することで、PUT実行前に第三者が更新した場合、自身の更新処理(上書き)をエラーにできます。
  • REST APIは非同期処理です。同期処理にするには「async/await」を使います。
目次