きわめて初心者です。よろしくお願いいたします。
実現したいこと
最終的には、複数のルックアップから、ひとつの値(個人番号)を特定し、その番号でルックアップを行いたいと考えていますが、前段階で挫折しています。
現状は、
- ルックアップ1 > フォーム上の「個人番号1」(フィールドコード。タイプ=数値)の値を取得する
- ルックアップ2 > フォーム上の「個人番号2」(フィールドコード。タイプ=数値)の値を取得する
- ルックアップ1または2の結果を、そのままルックアップのキーに複写できないということだったので、ボタンを配置して、ボタンがクリックされたら
- 個人番号1と個人番号2のうち、個人番号1を優先に、その値を「個人番号」(フィールドコード。タイプ=数値)に代入する。値がなかったら0を返す。
まで試しているところです。
CSVで書き出し、読み込みを行ってルックアップの更新をしたいと思っているので、「個人番号」は重複不可にしてあります。
複数のルックアップから、ひとつの値(個人番号)を特定し、その番号でルックアップ(できれば、自動取得)を行う別の方法があればそれでも、と思っていますが、まずは、レコードの値の取得方法がわかっていないので、ご助言いただければ幸いです。
エラー情報
以下18行目 window.alert(record.個人番号1.type); とすれば、NUMBERというタイプがという値が返されますが、window.alert(record.個人番号1.value); にすると、undefined となり、値が取得できません。
ボタンを押す前の開発者ツールのメッセージは
- uncaught ReferenceError:
- windows is not definied at HTMLButtonElement.mySpaceFirldButton.onclick
です。
期待する挙動は、kojin_1とkojin_2に、それぞれ、個人番号1、個人番号2の値が入ることです。
このエラー?が起きるため、その先のステップに進むことができません。
利用したソースコード
※フィールドコード=フィールド名に設定してあります。
- (function() {
- “use strict”;
- kintone.events.on(‘app.record.create.show’, function(event) {
- // 任意のスペースフィールドにボタンを設置
- var record = event.record;//event中のレコードのデータを利用します
- var kojin_1 = 1;
- var kojin_2 = 2;
- var kojin = 0;
- var mySpaceFieldButton = document.createElement(‘button’);
- mySpaceFieldButton.id = ‘my_space_field_button’;
- mySpaceFieldButton.innerText = ‘確定’;
-
- // 変数に初期値をあたえて検証 ← ※
- kojin_1 = record.個人番号1.value;
- kojin_2 = record.個人番号2.value;
-
- //値を検証してみる
- window.alert(record.個人番号1.type);
- mySpaceFieldButton.onclick = function () {
-
- // 個人番号1か2どちらかが入っていればどちらかが入っていれば、その値を個人番号へ
- // 個人番号1を優先評価する
- if (kojin_1 !== 0 ) {
-
kojin = kojin\_1;
- } else if (kojin_2 !== 0 ) {
-
kojin = kojin\_2;
- } else {
-
kojin = 0;
- }
- //再び検証
- window.alert(kojin);
- };
-
- kintone.app.record.getSpaceElement(‘my_space_field’).appendChild(mySpaceFieldButton);
-
- });
- })();
試したこと
varの場所やalertの位置を変えてみたりして、ようやくalertが出せるようになった程度です。
record[‘個人番号1’].valueという値で代入しようとしましたが、それも機能しませんでした。
再現条件
- このほかに、新規追加時に年次で連番を取得するスクリプトが先に走るようにしました。その中で、上記のルックアップ(1,2)を一つのグループにして、保存時や編集時にはこのグループはデフォルトで閉じているようにしてあります。
-
- デバイス(PC):
- OS・ブラウザ:Chrome / windows 10
- IP制限などネットワークに特殊なことがあれば:
Shinri さん
こんにちは。mofuku です。
投稿の内容を拝読いたしました。おそらく「はじめよう kintone API」を参考にしてソースコードを
書いているのではと推測いたします…。
実現したいことがたくさんあると思いますが、
まずは
「レコード編集画面もしくはレコード追加画面で、現在開いているレコードの値を取得し、個人番号フィールドの値を書き換える」
ということができるようになればいいのではないかと感じました。
今回、Shinri さんが行おうとしているのは、ボタンがクリックされたときに値を取得するという動きだと思います。
kintone JavaScript API には
という API があるので、
こちらを使用すれば、レコードの値が取得できます。
例としては、以下のように書けばいいと思います。
mySpaceFieldButton.onclick = function() {
// 現在開いているレコードを取得
var getRecord = kintone.app.record.get();
var kojin_1 = getRecord.record['個人番号1'].value;
var kojin_2 = getRecord.record['個人番号2'].value;
var kojin = getRecord.record['個人番号'].value;
// 条件分岐は、変数 kojin_1, kojin_2, kojin がそれぞれ String 型なので、
// 空の状態を表す「''」で記述しました。
if (kojin_1 !== '') {
kojin = kojin_1;
} else if (kojin_2 !== '') {
kojin = kojin_2;
} else {
kojin = '0';
}
// 「個人番号」フィールドの値を書き換え
getRecord.record['個人番号'].value = kojin;
// 値を書き換えたレコードをセット
kintone.app.record.set(getRecord);
};
onclick 関数の中でしたら、kintone.app.record.get() と kintone.app.record.set() を使用することができるので試してみてはいかがでしょうか。
(kintone.events.on のイベントハンドラ内で kintone.app.record.get および kintone.mobile.app.record.get を実行することはできません。)
mofuku様
ありがとうございました!期待通りの動作が実現できました。これで先に進むことができます。
よろしければ教えて下さい。
個人番号1,個人番号2,個人番号とも、すべて数値フィールドで用意していますが、
getRecord.record[‘個人番号1’].value; はString型で取得され、
最終的にString型の値を個人番号にセットすることができる
ということは、型にこだわらなくても大丈夫ということになるのでしょうか?
別のScriptで自動採番をしようとしたときにも、数値フィールドから取得してきた値に1を加算して、数値フィールドを書き換えようとしたら、何をやっても 1 + 1 = 11 と文字列結合になってしまいました。試しに 1+1*1 にしたら期待通り、結果が2になりました。
Shinri さん
こんにちは。mofuku です。
期待通りの動作が実現できたとのことで安心しました。
こちらの「フィールド形式」の「数値」の部分を読んでいただけるとわかるのですが、
数値フィールドの値を取得したときのレスポンスはクォーテーションで囲まれているため、
String 型と判断できます。数値フィールドなのに、って思いますよね…。
そのため、数値フィールドをJavaScriptのファイル上で計算して書き換えたいときは
型変換を行う必要があると思います。(参考:型変換 ※外部サイト)
計算を行いたいときなどはきちんと取得してきたフィールドの値の型が何になっているかを確認し、
適宜型変換などを行っていけばいいと思うので、型にはすこしこだわったほうがいいのではないかと考えます。
答えになっているかわかりませんが、少しでも参考になればと思います…。
mofuku様
ありがとうございました。varによる変数の宣言のときに型の指定もなかったので、あれこれ関数で置き換えを行ってみたのですが、試した際の整合性が取れていなかったのですね。
フィールド取得されるときはStringになっているとは全く気が付きませんでした。
ありがとうございます。
実現できたと思っていたのですが、申し訳ありません。
1. // 現在開いているレコードを取得
2. var getRecord = kintone.app.record.get();
3. var kojin_1 = getRecord.record[‘個人番号_1’].value;
4. var kojin_2 = getRecord.record[‘個人番号_2’].value;
5. var kojin = ‘0’;
6. // 条件分岐は、変数 kojin_1, kojin_2, kojin がそれぞれ String 型なので、
7. // 空の状態を表す「‘’」で記述しました。
8. window.alert(kojin);
- if (kojin_1 !== ‘’) {
-
kojin = kojin\_1;
- } else if (kojin_2 !== ‘’) {
-
kojin = kojin\_2;
- }
- else {
- kojin = ‘0’;
- }
17. window.alert(kojin);
のとき
kojin_1 !== “” が満たされるときは期待通りの動作となり
kojin_1 !== “” が満たされないとき、 kojin が undefinied になってしまいます。
9,10行目の kojin_1 を kojin_2 に書き換え、11,12行目のkojin_2をkojin_1に書き換えると、kojin_2 !==‘’ が満たされたときに期待通りの動作となり、満たされないときは、kojinがundefiniedになります。
すなわち、最初の条件を満たすときだけ正しく kojin に値が入り、最初の条件が満たされないときは kojinに正しい値が入りません。
念の為、8行の位置でkojin_1、kojin_2、kojin の値を確認すると、正しい値が入っていますが、17行目は、undefinied になります。
‘個人番号’ は、数値フィールド。 getRecord.record[‘個人番号’].type は NUMBERで、ルックアップのためのキー項目になっています。
5行目で kojin に '0’の代わりに 0 を代入しても状況は変わりませんでした。
15行目で kojinに '0’の代わりに 0 を代入しても状況は変わりませんでした。
度重なる質問で、本当に申し訳ありません。
Shinri さん
こんにちは。mofuku です。
「個人番号_1」フィールドに値を入力せず、「確定」ボタンを押下すると Shinri さんと同じように kojin は undefined になりました。
if 文の条件式の書き方の問題かなと感じたので、
if (kojin_1) {
kojin = kojin_1;
} else if (kojin_2) {
kojin = kojin_2;
} else {
kojin = '0';
}
というように書き換えたところ、期待した動作になりました。
「Javascript undefined 判定」などで検索すると詳しいことが書いているページが出てくると思うので
確認してみるといいかもしれません。
mofuku様
ありがとうございます。
個人番号_1が入っているとき、Nullのとき、個人番号_2が入っているときNullのとき、いずれもNullのとき、いずれも期待通りの動作が確認できました。
このif文の書き方はよくわかっていませんでした。わからずに通り過ぎてはいけなかったです。
困ったときに何を検索すればいいかについても勉強します!