ルックアップ - Bad Request (400)

皆様

お世話になります。

 

いろいろルックアップに関する記事を読んで真似はしているのですが

何故かBad Request (400)が返されて思うような動きになっておらず

苦戦しています。

 

構造としては

 

アプリA (メインフォームアプリ)

_ 部署名 _ (組織選択フィールドでIT部署、経理部などがログイン時にユーザー情報に応じて自動入力)

部署コード(ここをアプリBから自動的に取る予定)

その他多数のフィールド

 

アプリB (ルックアップに使用するための情報のみで今後一切変更予定なし)

部署名 (IT部署、経理部署など)

部署コード (11111、22222など)

(こちらのテーブルは必ず1 to 1です。)

 

状況として組織選択フィールドが自動で入力される仕組みになっており

標準のルックアップ機能が使用できないため組織選択フィールドの部署名を

アプリB内で検索し、抽出された部署コードを自動的にアプリAに

反映させようと考えております。

 

  //eventsはこれより上のコードにて定義済み
 kintone.events.on(events, function(e) {

var rec = e.record;
var parms = {
app: 328, //アプリBのID
id: rec.Dpt_Field.value[0].code //組織選択フィールドより
};
  //rec.Dpt_Field.value[0].codeは正常に動作することは確認済みで
  //「IT部署」などの名前が正常に取れています

kintone.api(
kintone.api.url('/k/v1/record', true),
'GET',
parms,
function(resp) {
       var record = kintone.app.record.get();
       .....

この時点ですでにBad Request (400)が発生しており、どうしてもrecordを

取ることができません。idを無しにしたりいろいろ試したりはしていますが

上手く動作しません。Authenticationが必要と書いてあるサイトも

あるのですが、アプリBは同じサブドメイン内でログインできる限り

特にアクセス制限も今はかけておりません。

 

素人質問で申し訳ないのですが、ご教示くださいますと大変幸いに存じます。

 

よろしくお願い申し上げます。

こんにちは。

 

「/k/v1/record」はレコード番号を指定してレコードを取得するAPIなので、リクエストパラメーターのidにはアプリBのレコード番号を指定する必要があります。

今回はレコード番号は分からないため、以下の「レコードの一括取得(クエリで条件を指定)」APIを使って、組織選択フィールドを条件にレコードを検索する事になると思います。(クエリを書く事になります)

https://developer.cybozu.io/hc/ja/articles/202331474#step2

 

クエリのイメージは、

query=アプリBの組織選択フィールド in (“アプリAの組織選択フィールドのcode”)

のような感じになると思いますが、アプリBの組織がログインユーザーの優先する組織と一致しているのであれば、

アプリBの組織選択 in (PRIMARY_ORGANIZATION())

という書き方も可能だと思います。

asaga様

ご回答くださいましてありがとうございます。

idは数字だけなのですね、queryに修正してみました。ただ、こちらの状態でもまだ

Failed to load resource: the server … responded with a status of 404 (Not Found)や単純にGET… 404(Not Found)という

エラーが返されてしまうようです。(’ 'や" "の位置、in ( xxx )を = xxxに変更する等によってエラーが異なるようです。)

部署名も部署コードもApp 328には存在しており、探している値も328内に

登録されているのでparmsの文法のどこかが誤っているのだと考えられるのですが素人目からは何が誤っているのか皆目見当もつきません。

var parms = {
'app': 328,
'query': '部署名 in('+ rec.Dpt_Field.value[0].code + ')',
'fields': '部署コード'
};

kintone.api(
kintone.api.url('/k/v1/v1/records', true),
'GET',
parms,
...

何かお心当たりがございましたらお手数おかけいたしますが、再度ご教示=くださいますと幸甚です。

よろしくお願い申し上げます。

DNakaさま

貼って頂いたコード通りだとすると、

'/k/v1/v1/records'

v1が重複しているようですが、ここは合ってますでしょうか?

asaga様

 

ご返信くださいましてありがとうございます。

申し訳ありません、こちらはコピーの際に間違えたようです。ただ余分な/v1を除いてもまたinではなく = としてみても

400 (Bad Request)が返されてきます。

 

var parms = {
'app':328,
    'query': '部署名 = "' + rec.Dpt_Field.value[0].code + "'" //,
//'fields':'部署コード'
};

kintone.api(
kintone.api.url('/k/v1/records',true),
'GET',
parms,
...

エラーメッセージの内容としては

GET https://サブドメイン名.cybozu.com/k/v1/records.json?app=328&query=部署名%20%3D%20"経理部 400 (Bad Request)

のようにChrome上では表示されております。

 

よろしくお願い申し上げます。

追記となりますが、Chromeのエラーメッセージには更にこのように書かれておりました。

組織選択フィールドの場合は = は使えないので、以下のように in を使えばエラーが発生しなくなると思います。

'query': '部署名 in ("' + rec.Dpt_Field.value[0].code + '")'

asaga様

 

何度もお手数おかけいたしました。おかげ様で解決することができました。

asaga様のおっしゃるようにinでも回り、また(何故か) =でも両方でqueryが機能いたしました。

(=の場合)

'query': 'Department="' + rec.Dpt_Field.value[0] + '"',

主な原因としましてはそもそもご指摘のとおりqueryではなく、idを使用していたこと、また ’  ’ や "  " の位置が一貫していなかったこと、

フィールド名の設定が上手くできていなかったことの3点でした。

 

大変勉強になりました。幾度となくお付き合いいただいてありがとうございました、本当に助かりました。