(再)フィールドの値をサブテーブル内にコピーしたい

お世話になっております。

コードが変わったため再度、質問させていただきます。

テーブルに支払日の入力が終わったタイミングでテーブル外にある数値をテーブル内にコピーしたく、初心者の為、複数のサイト等を参考にジャバを組んでみたのですがうまく作動せずに困っています。どなたかご教示いただけないでしょうか。

(やりたいこと)

支払日を入力したタイミングで、左下に表示される残高を入力した行の支払時点残高にコピー及び保存したい。

(コード)

(function() {
'use strict';
  var events = ['app.record.create.show', 'app.record.edit.show'];
kintone.events.on(events, (copy)
var rec = kintone.app.record.get();
var record = rec.record;
var table = record['残高'].value;
var contents = [];
if(row.value['支払日'].value.indexOf('有') )
{(row.value['テーブル文字列'].value)}
});
record['支払時点残高'].value = contents.join(', ');
kintone.app.record.set(rec);
};
return event;
});
})();

nekoko 様

こんにちは。

プログラミングは難しいですよね。

最初の頃から見ていて、一生懸命されてるようなので問題解決を一緒にやらせて頂ければ幸いでございます。

また、一番最初から投稿されていたものを実現されるまで nekoko 様とこちらで対応しようと思いますが、それ以外や以上の回答は控える場合がありますので、ご了承をお願いいたします。

答えだけお伝えするのはしておりませんので、あくまで考え方をお伝えするような感じになるかと思います。

今回の問題点としては、

 

> (やりたいこと)

> 支払日を入力したタイミングで、左下に表示される残高を入力した行の支払時点残高にコピー及び保存したい。

ということですよね?

 

そうすると、まずイベントのタイミングが違うかと思います。

サブテーブルの支払日に入力された時に発動するイベントは、

kintone JavaScript API(イベント)一覧 – cybozu developer network

この辺りにある、レコード追加画面・レコード編集画面にある『フィールド値変更』のイベントを使うことになります。

フィールドコードに指定するものは、サブテーブルのフィールドコードとサブテーブルの支払日のフィールドコードを追加するのが今後のことも考えて良いかと思います。

 

kintone.events.on の第二引数に指定している (copy) は、まず機能しておりません。

その原因は、ここには handler が入ります。

イベント処理の記述方法 – cybozu developer network

記述方法は、この辺りが勉強になるかと思います。

 

あとはとりあえずのデバックの知識ですね。

動かない?そんな時はデバッグをしてみよう!入門編 – cybozu developer network

まずは、この辺りの知識をしっかりしてみましょう。

 

サブテーブルの値のコントロールは、通常のフィールドの値のコントロールより難易度は高いので、ひとつひとつ丁寧に理解していかないと、他の方が書かれている記述も理解できず迷走してしまう可能性が高いのです。

大変失礼かと思いますが、いったん nekoko 様が記述された内容は忘れて一つ一つ丁寧にやっていきましょう。

 

まずは簡単なところで、イベントの内容を events に代入して、kintone.events.on 後に、console.log でレコード情報を確認できる記述からしてみて下さい。

それが終わったら、今回の議題に上がっている

> 支払日を入力したタイミングで、左下に表示される残高を入力した行の支払時点残高にコピー及び保存したい。

こちらについて解説をしていきたいと思います。

その後、最初に投稿されていた内容に近づくには多くの問題を含みますので少し長くなりますのでお付き合い頂ければ幸いでございます。

新屋 育男様

1つ1つ丁寧にリンク付きでの説明ありがとうございます。

リンクに目を通しながら知識を付けつつ

>イベントの内容を events に代入して、kintone.events.on 後に、console.log でレコード情報を確認できる記述からしてみて下さい。

を行ってみようと思います。

お時間及びご迷惑をお掛けすることもあるかと思いますが宜しくお願い致します。

nekoko 様

こんにちは。

自分で見て、ちょっと目標がわかりにくいですね。

 

console.log でレコード情報が確認できる = デバッガー(開発者ツール)のコンソールタブで情報を確認できる状態を指しています。

言葉足らずで申し訳ございませんが頑張ってみて下さい。

開発者ツールの便利な機能 – cybozu developer network

リンク先のgifのようにレコードの内容が確認出来たらOKですが、gifと同じように開発ツールに直接 kintone.app.record.get() を直接打ち込んで確認するのではなく、kintone.events.on より自動的に開発ツールのコンソールに表示されるようになるように頑張ってください。

余談ですが、開発ツールで直接 kintone.app.record.get() を打ち込んで確認するのもやってみると勉強になるかもしれませんのでやってみると良いかもしれません。

ただ今回のゴールは違いますので、そちらは履違えがないようにお願い致します。

 

追記

イベントタイプについてですが、

‘app.record.create.show’, ‘app.record.edit.show’

上記も含めておいてください。

※上記のイベント画面で、開発ツールのコンソールでレコードの詳細が確認できるようにしてみて下さい。

新屋 育男様

追加でのアドバイス並びに目標の再提示ありがとうございます。

コードの修正が出来ましたら、デバッカーを持ちいて確認をしてみます。

 

分からないことや行き詰った際にはご質問させて頂きます。

 

nekoko 様

とんでもございません。

この内容で分からないことはどんどん聞いて頂ければと思います。

 

課題に対して思考されていたら良い時間かと思います。

kintoneカスタマイズの基本的なデバッグの流れを身につけよう – cybozu developer network

上記のリンクにほぼ今回の議題の答えが記述されている箇所があります。

こちらも読んでみて頂ければ幸いでございます。

新屋 育男様

お世話になっております。

リンクを用いてのご説明有難うございます。

質問なのですがイベントタイミングを修正するのには下記のコードを追加すればよろしいのでしょうか。

 

app.record.create.change.<支払日>

 

nekoko 様

こんにちは。

はい、追加致します。

 

少し記述が違うので、そこだけ修正すれば大丈夫です。

 

画像の様に、仮にフィールドコードが支払日だった場合は、

app.record.create.change.支払日

上記のような記述になります。

新屋 育男様

こんにちは、お世話になっております。

画像付きでのご説明ありがとうございます。

<>は分かりやすくするための表記だったのですね。

 

今後ともよろしくお願いいたします。

nokoko 様

はい、その認識で大丈夫かと思います。

こういった記述は、見慣れない人には難しいですよね。

 

気になった点は、どんどん質問して頂ければ幸いでございます。

新屋 育男様

ありがとうございます。

パット見、必要なのかなとおもってしまいました。

コードを組めたと思い確認したところ、定義がされておらずエラーが起きたのですがエラーを直すことが出来なかったのでヒントを頂けないでしょうか。

 

エラー箇所は下から2行目です。

(function(handler){
'use strict';
app.record.create.change.支払日.
var,events = [`app.record.create.show``app.record.edit.show`]
kintone.events.on(events, (handler));var
rec = kintone.app.record.get();
var record = rec.record.残高;
var table = record支払時点残高.value;
var contents = [];
if (row.value.支払日.value.indexOf('有')) {
(row.value.支払時点残高.value);
}
});
record.handler.value = contents.join(支払時点残高);
kintone.app.record.set(rec);

nekoko 様

修正箇所は沢山ありますが、一番気になっていたコンソールからのエラー確認ができているので安心しました。

今回のコードの内容ですと、下から2行目(14行目)がエラーで正解です。

エラーになった原因は、record や contents が即時関数のスコープの外にあるのが原因で undefind になってしまっています。

 

ちょっと字は汚いですが、簡易的に注釈を入れておきます。

 

また即時関数は、

(function() {
// ここに実行したい内容を記述
})(); // ()を抜くと即時関数は実行されない

上記の中の  (function() { … })() この太字のかっこでくくられた部分を即時関数だと認識して頂ければと思います。

即時関数は cybozu 様の推奨ですので、この即時関数内で実行内容を記述するようにしましょう。

また、最初の方でスコープ外とお伝えしましたが、とりあえず今回は即時関数の外にある認識ぐらいで良いかと思います。

※スコープですが、実際はもう少しこまかいですが取り急ぎの認識でお願い致します。

 

イベントタイプの入れ方ですが、

var events = ['app.record.create.show', 'app.record.edit.show', 'app.record.create.change.支払日'];
// 上記の […この中にイベントタイプを記述する…] 

// 記述するイベントタイプが多くなって長くなる場合
var events = [
'app.record.create.show',
'app.record.edit.show',
'app.record.create.change.支払日'
];
// このように一行ごとにイベントタイプを記述していく方法もあります。

上記で作成した events変数ですが、こちらを kintone.events.on の第一引数に設定すると実行する内容のトリガーとなります。

kintone.events.on(events, handler) // events変数を設置したので、events に設定した内容のイベントで handler が実行される

handler は主に実行する内容を関数として記述したものです。

 

関数とは function から始まるような奴がだいたい関数と今は認識すれば大丈夫かと思います。

今回お伝えしている内容は、開発ツールのコンソールにレコードの内容を表示すること。

という内容ですので、handler として以下の様に関数を記述することができます。

function(event) {
console.log(event.record);
}

// 上記を handler変数へ代入する場合
var handler = function(event) {
console.log(event.record);
}

// handler変数を定義したので kintone.event.on の第二引数で利用できる状態になりました。
// events変数も定義されていると仮定して

kintone.events.on(events, handler);
// これでレコードの内容が表示されるということになります。

// 関数を変数に代入しない場合(今回は、handler変数に代入しない場合)
// kintone.events.on の第二引数へ直接関数を記述する方法があります。
kintone.events.on(events, function(event) {
console.log(event.record);
}

このような記述の仕方ですね。

 

ちょっと難しいかもしれません。

おそらく頭があっちこっちへ行ってると思いますので、いままでお伝えした内容をまとめると、

// 即時関数
(function() {
'use strict'; // ストリックモード

// イベントタイプの定義
var events = [
'app.record.create.show',
'app.record.edit.show',
'app.record.create.change.支払日'
];

// イベントタイプが ture の時にレコードの内容をコンソールに表示する。
kintone.events.on(events, function(event) {
console.log(event.record);
});
})();

少し認識が違う部分があるかもしれませんが、この説明で理解ができない部分などありましたらご質問下さい。

新屋 育男様

おはようございます。

 

即時関数をいまいち理解しきれていなかったのですが丁寧に説明をして頂けたので理解することが出来ました。

理解してから見ると素人目に見ても酷いですね…

 

各箇所に注釈を入れて頂きありがとうございます。

一つ一つの意味を多少ではありますが理解しながらコード入れれるようになってきました。

4行目に

Uncaught ReferenceError: varevents is not defined
at <anonymous>:4:13
at <anonymous>:16:2

というエラーが出てきてしまいます。

この様子だとまだまだエラーがありそうなので出来る限り直ししてみます。

 

(コード)

// 即時関数
(function() {
'use strict'; // ストリックモード
app.record.create.change.支払日.
varevents = [`app.record.create.show`,`app.record.edit.show`];
kintone.events.on(events, handler); // events変数を設置したので、events に設定した内容のイベントで handler が実行される
// イベントタイプの定義
var events = [
'app.record.create.show',
'app.record.edit.show',
'app.record.create.change.支払日'
];
// イベントタイプが ture の時にレコードの内容をコンソールに表示する。
kintone.events.on(events, function(event) {
console.log(event.record);
});
}());
record.handler.value = contents.join(支払時点残高);
kintone.app.record.set(rec);

お忙しいところ恐縮ですが引き続きよろしくお願いいたします。

nekoko 様

こんにちは。

エラーについてですが、varevents が定義されていません。

ということですね。

var は変数を定義するときに変数の前につけるのですが、var と events の間にスペースがないためエラーが発生している内容です。

 

私の説明が下手で申し訳ないのですが、4、5、6、18,19行名は不要でございます。

新屋 育男様

こんにちは。

 

is not defined は変数が定義されていないと言う事なんですね。

改行のご指摘ありがとうございます。

 

引き続きエラーの対処をしていきたいと思います。

またつまずいた時、または完成した時にご質問させていただきます。

 

引き続きよろしくお願いいたします。

 

新屋 育男様

こんにちは、お世話になっております。

小さなミスの修正は終わったのですが「undefined」と言うエラー表示があり、未定義ということがわかったので

解決策を調べてみたのですがわからず、再度ご質問させていただきました。

 

お忙しいところ恐縮ですが何卒宜しくお願い致します。

// 即時関数
(function() {
'use strict'; // ストリックモード
// イベントタイプの定義
var events = [
'app.record.create.show',
'app.record.edit.show',
'app.record.create.change.支払日'];
// イベントタイプが ture の時にレコードの内容をコンソールに表示する。
kintone.events.on(events, function(event) {
console.log(event.record);
});
}());

nokoko 様

こんにちは。

特に問題なさそうでが、エラーが表示されていますでしょうか?

表示されてないようでしたら、コンソールにレコードの情報が表示されていると思います。

 

問題ないようでしたら次に進みたいと思います。

その場合は、今イベントタイプに指定されているものが、

・レコード新規追加時

・レコード更新時

・レコード新規追加時にフィールドコード支払日に変更があった場合

と指定されておりますが、更に追加で<レコード更新時にフィールドコード支払日に変更があった場合>を追加して頂けますでしょうか?

また、kintone.event.on の中の console.log(event.record) の直下に console.log(event) を新に記述の追加ををお願いいたします。

新屋 育男様

お世話になっております。

確認したところコンソールに表示されたので次に進みたいと思います。

 

<レコード更新時にフィールドコード支払日に変更があった場合>を追加

 console.log(event) を新に記述の追加

上記二つを行い、再度ご連絡させていただきます。

エラーが表示された場合は、修正を試みてからご連絡させていただきます。

nekoko 様

良かったです。

今後は、コンソールに表示された event オブジェクトを理解しながら進めていきます。

こちらは基本の基の部分ですので、しっかりと理解をしていきましょう。

修正が終わり正常に機能しましたら、また改めてご連絡下さい。

新屋 育男様

こんにちは。お世話になっております。

9行目にて

Uncaught SyntaxError: Unexpected string

というエラーが出ており、綴りの間違いやセミコロン等の抜けかと思ったのですがそのような間違いもなく八方塞がりになってしまっています。

9行目を追加する前まではエラーが出ていなかったので原因は9行目で確定と思っております。

そもそもで入力したコードが間違っておりエラーが出ているのでしょうか。

// 即時関数
(function() {
'use strict'; // ストリックモード
// イベントタイプの定義
var events = [
'app.record.create.show',
'app.record.edit.show',
'app.record.create.change.支払日'
'app.record.create.submit.支払日'
];
// イベントタイプが ture の時にレコードの内容をコンソールに表示する。
kintone.events.on(events, function(event) {
console.log(event.record)
console.log(event)
});
}());