カテゴリー内の他の記事

第11回 kintone REST APIを利用したレコード更新

フォローする

(著者:Cstap 落合 雄一

はじめに

前回、kintone REST APIを利用し、アプリ情報やレコード情報の取得を取り扱いました。今回は、kintone REST APIを利用したレコードの更新を扱います。頑張っていきましょう\(^o^)/

ルックアップについて

ルックアップは、登録/更新時にコピー元からデータを取得し、コピー先フィールドにデータをコピーします。しかし、コピー元のデータを更新してもコピー先フィールドは変更されません(>_<)

これは困りましたね・・・
ということで、ルックアップの自動更新にチャレンジしてみましょう(*^^*)

アプリの準備

今回は、顧客マスターアプリと顧客マスターアプリをルックアップしている見積もり管理アプリを使います。

顧客マスターアプリ

下記のような顧客マスターアプリを用意します。

フィールド名

フィールドタイプ

フィールドコード

備考

レコード番号

レコード番号

レコード番号

 

会社

文字列(1行)

company

必須項目

部署

文字列(1行)

post

 

電話番号

リンク

tel

入力値の種類:電話番号

この顧客マスターアプリにJavaScriptを登録することで、ルックアップの自動更新を実現します。

 

見積もり管理アプリ

下記のような見積もり管理アプリを用意します。

フィールド名

フィールドタイプ

フィールドコード

備考

ルックアップ

ルックアップ

lookup

関連付けるアプリ:顧客マスター

コピー元のフィールド:レコード番号

ほかのフィールドのコピー:

 会社⇐[顧客マスター]会社

 部署⇐[顧客マスター]部署

 電話番号⇐[顧客マスター]電話番号

コピー元のレコード選択時に表示するフィールド:

 会社, 部署

会社

文字列(1行)

company

必須項目

部署

文字列(1行)

post

 

電話番号

リンク

tel

入力値の種類:電話番号

テーブル

テーブル

Table

 

テーブル[製品]

文字列(1行)

product

 

テーブル[個数]

数値

個数

最小値:0以上

テーブル[単価]

数値

単価

最小値:0以上

単位:¥

テーブル[価格]

計算

 price

計算式:個数*単価

計算式を表示しない

単位:¥

小計

計算

subtotal

計算式:SUM(price)

計算式を表示しない

単位:¥

消費税

計算

tax

計算式:subtotal*0.08

計算式を表示しない

単位:¥

合計

計算

total

計算式:subtotal+tax

計算式を表示しない

単位:¥

レコード番号で顧客マスターアプリからルックアップし、会社, 部署, 電話番号をコピーします。作成できたら、アプリIDは後で使うので控えておいてくださいφ( ̄ー ̄ )メモメモ

更新時イベント

ルックアップの自動更新を行うには、顧客マスターアプリの変更を見積もり管理アプリに反映する処理を行えばいいですね(^^)
変更時のイベント処理については第8回でも取り上げたので、忘れた方は復習しておいてくださいね(*^_^*)
今回は以下の2つのイベントを使って、変更内容を見積もり管理アプリにkintone REST APIで更新してみましょう!

もうお馴染みの形ですね(^^♪

更新が必要なレコードの一括取得

レコードの一括取得は、前回やりましたね(^^♪

kintone REST APIでの一括取得は、デフォルトで1度に100件までとなりますが、レコードの取得(GET)を参考に「query」パラメータの「limit」オプションを使用することで1度に500件まで取得することができます。
500件以上のルックアップの自動更新を行いたい場合は、全レコードの取得方法などを参考にしてください。今回は100件までの場合のみの説明になります^^;

ルックアップの一括更新

ここで、レコード一括更新のkintone REST APIのドキュメントを確認してみましょう(^^♪

必要なパラメータは、アプリIDと更新したいレコードIDと更新したいレコード情報をセットにしたオブジェクトですね。というわけで、更新したいレコードIDと更新したいレコード情報をセットにしたオブジェクトを作成する関数を用意しておきましょう(^^♪

更新するフィールドは、ルックアップのみとなります。このレコードの更新情報を使ってkintone REST APIで一括更新することで、コピー先フィールドを更新することができます。ここまで来ると、あとはレコードの一括更新APIを使って更新するだけですね(^^♪

前回前々回とkintone REST APIを触ってきたので、もうkintone.apiの説明は必要ないですね(*^_^*) まとめるとこんな感じのJavaScriptになります。
※見積り管理のアプリのアプリIDは環境によって変えてください。

では、このJavaScriptを顧客マスターアプリに登録しレコードの更新を行ってみましょう(^^♪

こんな感じでレコードを編集し保存すると・・・

アラートが表示されましたね!

では、見積もり管理アプリのルックアップしているレコードに更新内容が反映されているか確認してみましょう。

バッチリですね\(^o^)/

最後に

今回は、kintone REST APIを使ってルックアップを自動更新する方法を紹介しました!しかし、今回のサンプルだと100件までしかルックアップの自動更新ができないので、全レコードの取得方法などを参考に実装にチャレンジしてみてください(^^♪

Let’s kintoneカスタマイズ\(^o^)/

このTipsは、2015年1月版で確認したものになります。

<<第10回 kintone REST APIを利用したレコード取得 | 第12回 jQueryを利用してみよう>>

デモ環境

(顧客マスタ) https://dev-demo.cybozu.com/k/17/

(見積もり管理) https://dev-demo.cybozu.com/k/18/

※デモ環境についての説明はこちら

記事に関するフィードバック

直接的に記事と関連がないご質問はcybozu developer コミュニティをご活用ください。

Avatar
Ryu Yamashita

こちらのおまけに記載がありますが、見積もり管理アプリの編集頻度が高い場合には更新には注意が必要そうですね。

Avatar
田中

excel読み込みでルックアップ元のレコードを変更した際も、ルックアップ先のレコードは更新されますでしょうか??

Avatar
落合 雄一

田中さん
Excel, CSVでの一括更新ではルックアップ先のレコードは更新されません。
本Tipsに記載していますが、一覧および編集ページでの変更の保存実行前イベントで、ルックアップ先の更新を行っています。
これは、Excel, CSVでの一括更新とは関係ない処理です。

Avatar
田中

落合さん
承知いたしました。ありがとうございます。

Avatar
kanahey

失礼いたします。
こちらのサンプルですが、ルックアップのキーがID取得になっていますが、
文字列をキーにルックアップしている場合はどのように書き換えればよいでしょうか。
JavaScriptを触り始めたばかりなので、できるだけ詳しくご教示いただけますと幸いです。

Avatar
落合 雄一

kanaheyさん

著者の落合です。
第10回までを理解されている方にはご理解いただけるよう説明できているかと思いますが、至らない点をもう少し具体的にご指摘頂けますでしょうか?

文字列をキーにルックアップしている場合ですが、以下のように保存実行時イベントの query 部分を書き換えるとできるかと思います。

    // 保存実行時イベント
    kintone.events.on(['app.record.edit.submit', 'app.record.index.edit.submit'], function(event) {
        // レコードの一括取得(100件まで)
        kintone.api(
            kintone.api.url('/k/v1/records', true),
            'GET', {
                app: updateAppId,
                query: 'lookup = "' + event.record['文字列フィールドのフィールドコード'].value + '"'
            },
            function(resp) {
                var records = resp.records;
                // ルックアップの更新
                updateLookup(updateAppId, createPutRecords(records));
            }
        );
    });

以上、参考になりますでしょうか?

Avatar
kanahey

ご回答ありがとうございます。

こちら、query部分を文字列フィールドコードに書き換え、
ルックアップフィールドのフィールドコード(サンプルではlookup)を全てこちらが設定したものに書き換えた後に実行しましたが、
record.json の部分で"不正なリクエストです"というエラーが出ます。

こちら、原因等わかれば教えていただきたいです。

Avatar
Ryu Yamashita

横からですが、

record.json の部分で"不正なリクエストです"というエラーが出ます。

は、恐らく


records.json

でないといけない部分が


record.json

となっている等リクエストURLとリクエスト内容の不整合だと思います。

コミュニティの方でご紹介したことがあるかもしれませんが、このようなJavaScriptのデバッグはこちらの方法で、エラー時はerrorというプロパティを見ると原因がすぐ分かることがあります。
(今回の「不正なリクエストです」はerrorプロパティなかったと思いますが)

Avatar
kanahey

ご教示いただきありがとうございます。

こちらの表記に誤りがありました。失礼いたしました。
訂正前:record.json の部分で"不正なリクエストです"というエラーが出ます。
訂正後:records.json の部分で"不正なリクエストです"というエラーが出ます。

教えていただいたデバック方法も今後参考にさせていただきたいと思います。

落合様にご教示いただいた、文字列フィールドをキーにしている場合の修正法ですが、
レコード番号をキーにしていた際は動いていたソースでも、
ルックアップの設定を変更し、キーを文字列フィールドに変更すると"不正なリクエストです"とエラーがでてしまいます。

Avatar
Ryu Yamashita

レコード番号をキーにしていた際は動いていたソースでも、
ルックアップの設定を変更し、キーを文字列フィールドに変更すると"不正なリクエストです"とエラーがでてしまいます。

基本は同じですので、コピー元フィールドの重複禁止の設定が漏れているか(これはエラーで分かりやすいメッセージが出ます)、書き換えに失敗しているかですが、もう少し切り分けを進められませんか?

・エラーがGETで起きているのか、PUTで起きているのか
・エラーしている際のリクエスト内容は意図したものになっているのか

これらが押さえられれば原因がわかると思いますが、これらは先にご紹介した方法で確認することが出来ます。お試しいただきましたでしょうか。

Avatar
秋山

失礼いたします。こちらの記事を参考にkintoneでのJavaScriptをさせていただいております。

ルックアップの更新プログラムであげていただいている処理をサンプルソースを参考に作成していたのですが、
どうやら本記事の最後にあがっているルックアップ更新サンプルソースの57行~61行の処理
function(resp) {
var records = resp.records;
// ルックアップの更新
updateLookup(updateAppId, createPutRecords(records));
}
の var records = resp.records;で得られたrecordsをrecords.lengthで確認したところ0となりました。
これは正常な動きなのでしょうか。お分かりになる範囲でよろしいので、ぜひご教授いただけたらと思います。

Avatar
落合 雄一

秋山俊介さん
cstapの落合です。

ルックアップ先のアプリにルックアップしているレコードがないのではないでしょうか?

Avatar
秋山

ご回答ありがとうございます。

「ルックアップ先のアプリにルックアップしているレコードがない」とのお答えをいただいて、
一応確認したのですが、断言はできませんがレコードはある、と思います。
また、同ルックアップ更新サンプルソースの52行目から56行目に該当するコードで
kintone.api.url('/k/v1/records', true),
'GET',
{
"app": updateAppId,
"query": '案件管理の会社名 = "' + event.record.会社名.value + '"'
},
という記述を行っており、ルックアップ先のアプリのルックアップレコードのフィールド名が「案件管理の会社名」、
ルックアップ元の参照されているレコードのフィールド名が「会社名」の状態です。
問題があるとすれば、この記述に何か間違いがあるからだと思われるんですがどうでしょうか。

たびたびにはなりますが、ご教授いただければ幸いです。

Avatar
落合 雄一

queryに使うのは、フィールド名ではなくフィールドコードになります。
フィールドコードを一度確認してみてください。

Avatar
秋山

ご回答ありがとうございます。

先ほどの説明で「フィールド名」と表記したものは、正しくは「フィールドコード」でした
ですので、
  ルックアップ先のアプリのルックアップレコードのフィールドコード→「案件管理の会社名」
  ルックアップ元の参照されているレコードのフィールドコード→「会社名」
が正しい現在の状態です。
私の説明不備で混乱させてしまい、申し訳ありませんでした。
フィールドコード以外に何かご指摘ありましたら、もう1度ご回答いただければ幸いです。

Avatar
Ryu Yamashita

秋山俊介さん

横ですが、queryで「=」によるGET/recordsは、「すべて」の一覧の絞込における「 =(等しい)」による絞り込みと同じですので、APIのレスポンスとレコード一覧画面からの絞込のレコードが等価になる必要があります。言い方を変えますと、一覧画面で得られる結果に合うようにqueryが指定できれば良いということになります。一覧画面と個数があってるかを見ることで確認しやすくなると思います。

また、queryの指定はJavaScriptであればこちらの方法で自分が意図したqueryとレスポンスになってるか確認しやすくなりますので、リファレンスと合わせて確認頂ければと思います。

Avatar
秋山

ありがとうございます。教えていただいたことを参考にし、ルックアップの自動更新を行うことができました。

原因はqueryで指定した絞り込み条件(フィールド)を変更しようとしてしまっていたために、当初の質問にあったrecords.length→0が起きてしまっていたようです。
queryによる絞り込み条件を別に用意し変更を行ったり、そのままのqueryの絞り込み条件で関連するフィールドを変更してみたところ、正常な動作を行うことができた次第です。

何度も質問させていただきましたが、その都度ご返答くださり、誠にありがとうございました。
まだまだ勉強不足な面がありますが、kintoneを活用させていただきたいと思っておりますので、
いろいろ試していきたいと思います。

Avatar
ナカゴウユイエ

ルックアップの自動更新の記事を読ませて頂きました。
一点質問があります。サンプルソースの中で、
record: {
lookup: {
value: record.lookup.value
}
}
の表記が出てきました。
ルックアップのキーとなる項目にアクセスするためには、上記の分を参考にしますと、
kintone.events.on(['app.record.create.submit', 'app.record.edit.submit'], function(event) {
var tblrecord = event.record.テーブル名.value;
var tblrecord2 = tblrecord[行数].value;
var tblrecord3 = tblrecord2[ルックアップのキーのフィールド名].value;
})();
で、あっていますか?
ルックアップによってコピーされるデータは上記のソースで取得できますが、キーとなるフィールドだけundefになります。
キーとコピーされるフィールドへアクセス方法は違うのでしょうか?
よろしくお願いします。

Avatar
Ryu Yamashita

ナカゴウユイエさん

イベントやサブテーブルか否かによって、またルックアップのキーフィールドだからといって、取得方法が異なるといったことはないかと思います。

(全体が見えないので何とも言い難いところはありますが)スニペットをそのまま捉えると、submitイベントの中でアクセスしにいかれているようですが、文字通り保存前のrecord情報にアクセスできるはずです。

Avatar
cybozu Development team

記事改訂情報:

2015年11月のアップデートにより、「query」パラメータの「limit」オプションを使用することで1度に500件取得可能な旨を追記いたしました。

ログインしてコメントを残してください。
Powered by Zendesk