お世話になります。
kintone REST APIに関してご質問させて頂きます。
あるアプリ(以下、アプリA)上の関連レコード一覧フィールドを用いて、
別アプリ(以下、アプリB)のレコードを呼び出して使用しております。
その延長として、さらに関連レコードのレコード数を
数値フィールドにでも入れたいと考え、XMLHttpを使って
JavaScriptにて以下の様なプログラムを組みました。
(function() {
“use strict”;
//レコードの編集、詳細画面で適用する
var events = [
'app.record.edit.submit',
'app.record.edit.show'
]
kintone.events.on(events, function(event) {
var record = event.record;
var client_rank = record['(アプリAのフィールド名)']['value'];
var query = '(アプリBのフィールド名)='+client_rank;
query = encodeURIComponent(query);
var appUrl = 'https://(サブドメイン).cybozu.com/k/v1/records.json' +'?app='+ '(アプリ番号)' + '&query='+ query;
// 同期リクエストを行う
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", appUrl, false);
xmlHttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
xmlHttp.send(null);
//取得したレコードをArrayに格納
var resp_data = JSON.parse(xmlHttp.responseText);
var num = resp_data.records.length;
record['(アプリAの数値フィールド名)']['value'] = num;
console.log(resp_data);
return event;
});
})();
実行したところ、「クエリの指定が不正です」というメッセージが表示されました。
クエリの部分を消して実行したところ、当然ですが、
絞りこみなしの全レコード数が表示されました。
クエリを指定する部分の書き方に問題があると思うのですが、
自力で調べても正しい書き方がわからなかったため、
こうしてご質問させて頂いた次第でございます。
クエリの書き方にお詳しい方いらっしゃいましたら、
正しい書き方をご教授いただければ幸いです。
よろしくお願い致します。
Yuta Onishi様
cstapの落合です。
まず、JavScriptからREST APIを利用する場合は、XMLHttpRequestではなくkintone.apiを使ってください。
クエリの書き方ですが、
js var query = '(アプリBのフィールド名)='+client_rank;
を
js var query = '(アプリBのフィールド名) = '+client_rank;
という感じにしてみてトライしてみてください。
確認していないので、なんとも言えませんが、「=」の前後にスペースが必要なのかもしれません。
以上、参考になりますでしょうか?
var query = ‘(アプリBのフィールド名)=’+client_rank;
var query = ‘(アプリBのフィールド名)="’+client_rank +‘"’;
value部分は"で囲む必要がありそうな
動作未確認ですw
かき氷さん、そうですね!!
私もこれが原因っぽい気がします!
Onishiさん、
「クエリの指定が不正です」が出たときに,私がよくやっていたミスは・・
・フィールドコードの指定ミス、フォーム側でフィールドコードをちゃんと指定していなかったなど
・文字列指定が必要な場合に、フィールド名="データ"のように、"でデータを囲むことをしていなかった
などがありました。ご参考になれば。
REST APIと関連レコードという点では、次の既出の分が参考になりそうです。
https://cybozudev.zendesk.com/hc/ja/articles/203030394
https://cybozudev.zendesk.com/hc/communities/public/questions/201310104
https://cybozudev.zendesk.com/hc/communities/public/questions/201009090
ちなみに、JavaScriptのトピックに出てるのはいずれもxmlHttpRequestですが、落合さんがおっしゃってる通り、同期リクエストが不要であれば、kintone.api()の利用が良いと思います。
また、皆さんが言及されているクウォテーションは値が数値の時には顕在化しないので、文字列を対象にした時に最初「あれ」となります。(3つ目のリンクでも最初外れていましたが、やり取りの中で修正されています)
ひとつ忘れていましたが、対象とする関連レコードが100件超えるようであれば、こちらも入れておかれるのが良さそうです。
https://cybozudev.zendesk.com/hc/ja/articles/201501294
皆様たくさんのご回答まことにありがとうございます。
クエリ部分を var query = ‘(アプリBのフィールド名)="’ + client_rank+‘"’;
とダブルクォーテーション、スペース、+など書き足すことで
無事に動かすことができました!
それと、別質問になってしまうのですが、
HTTPではなくkintone.apiを使ったほうがよい理由と
クエリを指定してkintone.apiでGETする方法について
お教え頂けないでしょうか。
クエリ付きのURLをエンコードしておいて、
kintone.api(https://〜略〜/?app=略&query=略,GET,{app:番号},function(resp){関連レコード数の取得と代入});
で合っておりますでしょうか・・・。
クウォテーションが適宜必要そうな箇所はありますが、リクエストの書きっぷりは問題ないのではないでしょうか。
kintone.api()のおすすめ理由は、私からは2点です。
1つ目は繰り返しになりますが、同期リクエストは極力避けるという点に関連します。詳しくはこちらをご覧頂くのが良いと思います。https://cybozudev.zendesk.com/hc/ja/articles/201850320
2つ目は、準備された関数を用いることでこれら問題点を吸収してくれるといったところかと思います。例えば、モバイルでも同様の記述をしようと思った時に、ほぼそのまま適用できる、とかですね。
Yamshita様
いつもお世話になっております。ご回答ありがとうございます。
リンク先を拝読し、kintone.apiへの書き換えと、
プログラムをエラーなく動作させることができましたこと、
報告だけさせて頂きます。
ご回答頂きました皆様、ありがとうございましたm(_ _)m