初心者質問で失礼いたします。
下記のjavaスクリプトを記載したのですがAPIリクエストでエラーが出てしまい困っています。
有識者の方でご教授いただけないでしょうか。
何卒宜しくお願い致します。
(() => {
‘use strict’;
// レコード追加、編集画面の表示前処理
const eventsShow = ['app.record.create.show', 'app.record.edit.show', 'app.record.index.edit.show'];
kintone.events.on(eventsShow, (event) => {
const record = event.record;
if (['app.record.create.show', 'app.record.edit.show'].includes(event.type)) {
record.注文書番号.value = '';
}
record.注文書番号.disabled = true;
return event;
});
// レコード追加画面の保存前処理
kintone.events.on('app.record.create.submit', (event) => {
const record = event.record;
const orderNumberField = '注文書番号';
// 注文書番号が既に入力されている場合は自動採番しない
if (record[orderNumberField].value) {
return event; // 既に注文書番号が設定されている場合は何もしない
}
// 自動採番を注文書番号に設定する
const params = {
'app': kintone.app.getId(168),
'query': 'limit 1',
'fields': [orderNumberField]
};
const apiToken = '設定したAPI'; // ここに発行したAPIトークンを設定
console.log('APIリクエストを行う前'); // APIリクエストを行う前にメッセージを表示
return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params, apiToken).then((resp) => {
// APIリクエストの成功時の処理
console.log('APIリクエストが成功しました', resp); // APIリクエストが成功した場合にメッセージを表示
console.log('APIレスポンス:', resp); // レスポンス全体を表示
console.log('注文書番号の値:', resp.records[0] ? resp.records[0][orderNumberField].value : 'null'); // 注文書番号の値を表示
if (resp.records[0] !== null && resp.records[0][orderNumberField].value) {
const lastNumber = parseInt(resp.records[0][orderNumberField].value.slice(5), 10); // 最後の5桁の数字を取得
if (!isNaN(lastNumber)) {
const nextNumber = lastNumber + 1;
const paddedNumber = String(nextNumber).padStart(5, '0'); // 5桁の数字にパディング
const autoOrderNo = `AWSS-${paddedNumber}`;
alert(`注文書番号 ${autoOrderNo} を登録します`);
record[orderNumberField].value = autoOrderNo;
} else {
event.error = '注文書番号の取得に問題があります。';
}
} else {
// 初めての注文書の場合、自動採番を行う
const autoOrderNo = 'AWSS-00001';
alert(`注文書番号 ${autoOrderNo} を登録します`);
record[orderNumberField].value = autoOrderNo;
}
return event;
}).catch((error) => {
// APIリクエストのエラー時の処理
console.error('APIリクエストエラー', error); // エラーが発生した場合にメッセージを表示
record[orderNumberField].error = '注文書番号が取得できません。';
return event;
});
});
})();
mura
2
その通信時のエラーをはると、解決に繋がりやすい&回答が集まりやすいとおもいます!
「いいね!」 1
ご回答をいただきまして誠にありがとうございます。
ネットワークの部分ではエラーが出ておらず、
コンソールでアラーが吐き出されます。
return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, params, apiToken).then((resp) => {
の部分でエラーとなっているのですが、当方では見当がつかない状況です。
良ければご教授いただけないでしょうか。
mura
4
使用法がちがいますよ、というメッセージですね。
たしかに、よくよくみるとパラメータの数が違います
return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, params, apiToken).then((resp) => {
ここのサンプルコードと比較してください!
具体では、kintoneのJSカスタマイズにおいては、apiTokenは不要です(というより第四引数にいれるものではないです)
「いいね!」 1
ご回答をいただきまして誠にありがとうございます。
おかげで該当のエラー部については解消ができました。
ただ、自動採番は行えず、‘query’: 'limit 1’でエラーが起きます。
'limit 1’なので最後のレコードを読み取る設定と思いますが、違うのでしょうか。
引き続きの質問で恐縮ですが、ご教授いただけますと幸いに御座います。
mura
6
繰り返しになってしまってもうしわけないのですが、
エラーは貼ってもらえますと!
そうすればなにかわかるかもしれません!
「いいね!」 2
大変失礼いたしました。
このようなこのようなエラーになります。
クリックすると’query’: ‘limit 1’,部が表示され赤いXマークがついております。
Xマークには、Uncaught SyntaxError: Unexpected stringと記載があります。
ご確認をいただけますと幸いです。
mura
8
syntaxエラーというのはJSの文法そのものがおかしいということでして、
可能性としてはどこかの括弧閉じがたりなかったり、オブジェクトの中にカンマがたりなかったりする可能性があります。
…と、ここまで書いてきづいたのですが、もしかしてシングルクォートじゃない説ありますか?
文字列を囲むときは、シングルクォート 'query': 'limit 1'
かダブルクォート"query": "limit 1"
にしてください!もちろん半角です!
それが原因じゃない場合、周囲にカンマたりないとか、全角使ってるとか書式上の間違いがありそうなので、みてみてください。
「いいね!」 2
ありがとうございます。
自分もびっくりしたのですが「,」が抜けていたり「=」があったりと、
ひどいことになっておりました。。。
失礼いたしました。
こちらの部分についてはご協力のおかげで解決できたのですが、新たな問題が発生しております。。。
振り出しに戻った感が強いですが、
「 if (resp.records[0] !== null && resp.records[0][orderNumberField].value) {」の部分で再びエラーとなっております。
ご教授いただけますと幸いです。。。
mura
10
orderNumberField
で指定しているフィールドコードが間違ってるのではないか、とおもいましたが取得するときのパラメータで使ってそうなのでそこは間違ってない、ということでいいですかね(念のためご確認を)
まずは、respの中身をご自身で見て本当に値があるときに失敗してるのか、というのが大きなポイントですが、コードを拝見するに
resp.records[0] !== null
このデータの存在判定が機能しないですね。records[0]が存在しない時 null
ではなく undefined
になるためです
配列(APIから返ってきたレコード一覧)の存在チェックは、resp.records.length > 0
など、lengthをみるようにしてください、配列の場合は.lengthをみることで何個データがはいっているかわかるためです。
そこは最低限なおしつつ、それでも改善しない場合respのなかみをしっかり確認してみてください。
「いいね!」 2
ご回答いただきましてありがとうございます。
ご指摘の通り修正しましたら、00001の採番が可能になりました。
ですが、次のレコードを登録した際も00001になり番号の加算がされない形となります。
エラーコード等は特に出ていないのですが、お気づきの点があればご教授いただけないでしょうか。
mura
12
考えられる点としては、条件分岐にうまくはいってなかったり、そのコードには到達してるが何らかの理由で+1できてないことがありうるんじゃないでしょうか?
それぞれに一度ブレークポイントはって値がどうなってるのか、みてみるといいとおもいます!
「いいね!」 1
お返事をいただきまして誠にありがとうございます。
また確認が遅くなり申し訳ございません。
エラー等は出ておりませんが、
確認したところ最後のレコードの注文書NOを読み込めていないのが原因と推察できました。
理由としては、
} else {
// 初めての注文書の場合、自動採番を行う
const autoOrderNo = ‘AWSS-00001’;
alert(注文書番号 ${autoOrderNo} を登録します
);
record[orderNumberField].value = autoOrderNo;
}
の部分を削除すると、自動採番が行われなくなりました。
恐らくですがすべてのレコードが新規のレコードとして認識されているのかと存じます。
最後のレコードを読み込む部分にフォーカスしご教授いただく事は可能でしょうか・・・?
引き続きになりますが何卒よろしくお願い申し上げます。
@y_takahashi さん
こんにちは、横槍失礼します。
@mura さんも触れられているこの部分ですが、こちらが原因で条件分岐がうまくいってないと思われます。
恐らくですが、このように
resp.records[0] !== null => resp.records[0] != null
一つ = を抜けば、nullでもundefindでも対応できるようになるかと思われます。
失礼いたしまた。
現在のコードでは「resp.records[0] !== null && resp」の部分を「resp.records.length > 0 && resp」にて書き直しております。
ただ、「resp.records[0] != null」「resp.records.length > 0」どちらの場合でも番号が追加されていくことは御座いませんでした・・・
何か解決法はないでしょうか・・・
以上でございます。
引き続きになりますが何卒よろしくお願い申し上げます。
なるほどですね。
それともう一点気になったところとして、REST APIでレコードを取得されていると思いますが、そちらが原因でもしやREST API自体がうまくいっていないため
「resp.records[0] != null」「resp.records.length > 0」
としてもできてなんじゃないかなと思われます。
一度paramsを以下で試してみてどうでしょう?
const params = {
'app': kintone.app.getId(),
'query': 'order by orderNumberField desc limit 1',
'fields': ["orderNumberField"],
};
追記)
上記エラーを見ていると取得したresp.recordsはarray0になっていますね…
取得してきているはずのrecordsの配列の中身が空っぽのためそのようになっています。
申し訳ないです、私の認識がずれていました。
orderNumberFieldというフィールドコードがあると思っていましたが、変数だったのですね…
const params = {
'app': kintone.app.getId(),
'query': 'order by orderNumberField desc limit 1',
'fields': [orderNumberField],
};
こちらで試していただければと…
ご回答ありがとうございます。
私も確認しておりませんでしたが、
変数での実行になっていると思われます。
↓私が実行したJS
const orderNumberField = ‘注文書番号’;
// 注文書番号が既に入力されている場合は自動採番しない
if (record[orderNumberField].value) {
return event; // 既に注文書番号が設定されている場合は何もしない
}
// 自動採番を注文書番号に設定する
const params = {
'app': kintone.app.getId(),
'query': 'order by orderNumberField desc limit 1',
'fields': [orderNumberField],
'apiToken': "",
};
何度も申し訳ございません。
ご確認をいただけますと幸いです。
queryの部分も修正する必要がありましたね…
const params = {
'app': kintone.app.getId(),
'query': 'order by 注文書番号 desc limit 1',
'fields': [orderNumberField],
};
でいいかと思われます。
していることとしては、注文書番号を降順で取得して一件に絞るという意味ですね。
また、kintoneREST API(kintone内部)でAPI Tokenを使用して、実行できません。
もし、apiTokenを使用して実行されたいのでしたら、過去に私がまとめた記事を下記に貼りますのでこちら確認してみてください。
また、ガイドラインにも書かれていますが機密事項のAPI Tokenをこちらに載せるのは危険なので、なるべく早く編集して消された方がいいかと思われます…
ご回答をいただきまして誠にありがとうございます。
一度、試してみます。
またご指摘をいただきましてありがとうございます。
編集にて削除いたしました。
以上でございます。
引き続きになりますが何卒よろしくお願い申し上げます。