SQLの窓

2016年05月06日


kintone JavaScript API で ルックアップ先が更新された場合の参照元を全て更新する

kintone のドキュメントは欲しいものを探しにくい欠点があるのですが、その中でも一番重要な『ルックアップの一括更新』について解説しているページのタイトルが『第11回 REST APIを利用したレコード更新』となっていて気がつきにくくなっている上に、少しバグっています(その通りに実装したら不具合が出た)

▼ 以下がこちらで作成したサンプルコードです。
// *****************************************
// (function(){実行コード})() は JavaSript 
// におけるブロックの実行
// *****************************************
(function() {
	"use strict";

	var target = null;
 
	// レコード一覧画面で更新した場合のイベント
	kintone.events.on('app.record.index.edit.submit', function(event) {

		console.log("レコード一覧画面の event オブジェクト");
		console.dir( event );

		// ルックアップを実装している対象 appid
		var appid = 23;
		// 今回更新したルックアップが参照している値
		// ※ 一般フィールドの場合、要重複不可設定
		var target = event.record.レコード番号R.value;

		var manager = new KintoneRecordManager;
		manager.getRecords(appid, target, function(records) {

			console.log("レコードの取得後のイベント");
			// 取得した全レコードの表示
			console.dir(records);

			// レコード取得後の処理
			updateLookup(appid, createPutRecords(records));
			// 空にしておかないと、次の UI での処理で残ってしまう
			KintoneRecordManager.prototype.records = [];
			KintoneRecordManager.prototype.offset = 0;

		});


	});

	// レコード編集画面
	kintone.events.on('app.record.edit.submit', function(event) {

		console.log("レコード編集画面の event オブジェクト");
		console.dir( event );

		// ルックアップを実装している対象 appid
		var appid = 23;
		// 今回更新したルックアップが参照している値
		// ※ 一般フィールドの場合、要重複不可設定
		var target = event.record.レコード番号R.value;

		var manager = new KintoneRecordManager;
		manager.getRecords(appid, target, function(records) {

			console.log("レコードの取得後のイベント");
			// 取得した全レコードの表示
			console.dir(records);

			// レコード取得後の処理
			updateLookup(appid, createPutRecords(records));
			// 空にしておかないと、次の UI での処理で残ってしまう
			KintoneRecordManager.prototype.records = [];
			KintoneRecordManager.prototype.offset = 0;

		});


	});
 
	// *****************************************
	// kintoneと通信を行うクラス
	// *****************************************
	var KintoneRecordManager = (function() {

		// これがこの中で作成される KintoneRecordManager
		function KintoneRecordManager() {
		}

		// プロパティの定義
		KintoneRecordManager.prototype.records = [];	// 取得したレコード
		KintoneRecordManager.prototype.limit = 2;		// 一回あたりの最大取得件数
		KintoneRecordManager.prototype.offset = 0;		// オフセット


		// すべてのレコード取得する メソッドの定義
		KintoneRecordManager.prototype.getRecords = function(appid, target, callback) {

			console.log("appid : " + appid);
			console.log("target : " + target);

			// kintone.api (REST APIリクエストを送信)
			kintone.api(
				// kintone REST APIのパス または kintone.api.urlで取得したURL
				kintone.api.url('/k/v1/records', true),
				// 使用するHTTPメソッド
				'GET',
				// APIに渡すパラメータ
				{
					app: appid,
					// 参照条件
					// ※ ここではフィールドコードを固定で定義するようにしています
					query: 'LUP_参照コード = "'+ target + '" ' + (' limit ' + this.limit + ' offset ' + this.offset)
				},
				// APIの呼び出しが成功したら実行されるコールバック関数
				// ※ function を return しているので、この中がコールバック処理です
				(function(_this) {
					return function(res) {

						console.log("kintone.api の callback が呼び出されました:" + appid + ":" + target);

						// ここからがコールバック処理
						var len;

						// KintoneRecordManager のプロパティに新しいレコードを追加
						Array.prototype.push.apply(_this.records, res.records);
						// 今回取得したレコード数
						len = res.records.length;

						console.log("今回取得したレコード数:" + len);

						// KintoneRecordManager のプロパティ全レコード数をセット
						_this.offset += len;

						// 読み込み件数制限付きで、全件読む方法
						if (len < _this.limit) { // まだレコードがあるか?

							// 全件読み込んだので、callback を呼び出す
							if (callback !== null) {
								callback(_this.records); // レコード取得後のcallback
							}
						}
						else {
							// まだレコードが残っているので、offset 以降を再度呼び出して処理する
							_this.getRecords(appid, target, callback); // 自分自身をコール
						}
					};
				// this は KintoneRecordManager なので、処理内の _this が KintoneRecordManager
				})(this)
			);
		};

		// この処理の中で作成した KintoneRecordManager 関数を外の KintoneRecordManager 変数に設定する事になります
		return KintoneRecordManager;
	})();


	// *****************************************
	// 更新用オブジェクトの配列を作成するメソッド
	// *****************************************
	function createPutRecords(records) {
		var putRecords = [];
		for (var i = 0, l = records.length; i < l; i++) {
			var record = records[i];
			putRecords[i] = {
				id: record['$id'].value,
				record: {
					"LUP_参照コード" : {
						value: record.LUP_参照コード.value
					}
				}
			};
		}

		// 更新用オブジェクトの配列
		console.dir("putRecords:" + putRecords);

		return putRecords;
	}

	// *****************************************
	// 更新用 API を呼び出すメソッド
	// *****************************************
	function updateLookup(appId, records) {
		// KintoneRecordManager.prototype.limit で割り切れるレコード数の場合
		// 最後に records.length == 0 で呼ばれる
		if ( records.length != 0 ) {
			kintone.api(

				// kintone REST APIのパス または kintone.api.urlで取得したURL
				kintone.api.url('/k/v1/records', true),
				// 使用するHTTPメソッド
				'PUT',
				// APIに渡すパラメータ
				{
					app: appId,
					records: records
				},
				function(resp) {
					// 更新完了時の処理
				}

			);
		}
	}

})();

オリジナルのソースコードからはとても解りにくいであろう、JavaScript 特有の記述が理解しやすいように記述してコメントを付加しています。

▼ 関連する API ページ
kintone.api と kintone.api.url
( その他 : kintone.api.urlForGet、kintone.getRequestToke )


要点

ここでは、参照するアプリ(テーブル)のレコード番号をキーに使用していますが、一般フィールドをキーとする場合、重複不可の設定が必要です。

レコード一覧画面で、直接変更する時と1レコードの表示にしてから変更する時とでは別々のイベント定義が必要です。

ルックアップを実装している対象 appid は現在一つだけ使用していますが、一般的な実装ではここは配列になるべきです。また、その場合は getRecords の完了部分で、次の呼び出しが必要になるので、それなりの改造とテストが必要になります。具体的には、全件読み込んだ後の callback を呼び出す部分で次の appid の呼び出しとなると思います。その場合、引数の appid は、他のプロパティと同様に、prototype で定義すれば良いと思います

参照(検索)用の フィールドコードを固定で定義して使用していますが、汎用的にするにはプロパティ定義か引数定義にします。

JavaScript では function を、処理を格納した変数や値の定義として多用します。例えば、無名 function の場合は return function(){} として処理を戻り値としたり、有名 function では、function name(){} として name という変数を定義してそれを return name として処理を戻り値として返したりしています。

▼ kintone.api.url では、最後のパラメータが省略されているので注意して下さい。
ゲストスペース内でtrueを指定する場合、REST APIの実行に必要なゲストスペース用のURIが返されます。
デフォルトはfalseです。


posted by lightbox at 2016-05-06 17:18 | kintone | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり