https://developer.cybozu.io/hc/ja/community/posts/360048302952
上記を参考にテーブルの日付の取得のスクリプトを作成したのですが、
エラーも出ず、動かないので、ご指摘頂きたいです。
テーブル:実施予定と日付
テーブル内日付:実施予定日
フィールド日付:最終実施日
これが上手くいったあとは、別のフィールドへ次の予定月を記載したいと思っておりますが、予定月に関しましては、人の手が入ることがあるため、
このスクリプトに「submit」は使わず、「change」を使用しようと考えています。
(function () {
“use strict”;
kintone.events.on(‘app.record.edit.change.実施予定日’, function (event) {
const tableDate = event.record.実施予定と日付.value;
const dates = tableDate.map(function (cur){
return new Date(cur.value.実施予定日.value);
});
const maxDate = new Date(Math.max.apply(null,dates));
event.record[‘最終実施日’].value = maxDate;
return event;
});
})();
こもるーさん、こんにちは。
maxDateはkintoneが受け取れるフォーマットになっていますでしょうか?
詳しくは以下に記載がありますが、YYYY-MM-DD形式にする必要があります。
https://developer.cybozu.io/hc/ja/articles/201941754#step6
asagaさん
再びお世話になります、こもるーです。
すみません、意味合いの確認なのですが、format(“YYYY-MM-DD”)として指定する、ということで合ってますか?
理解が間違っていたら申し訳ありません。
合っていた場合、
>event.record[‘最終実施日’].value = maxDate;
に
event.record[‘最終実施日’].value = maxDate.format(“YYYY-MM-DD”);
と思ってトライしてみたのですが、違うっぽくエラーも出ず。。。
間違っていた場合、が思い浮かばず。
こもるーさん
はい、記載頂いた通りの意図だったのですが、不思議ですね・・・。
ちなみにmoment.jsを読み込ませた状態で、
event.record['最終実施日'].value = moment(maxDate).format("YYYY-MM-DD");
としたらうまく動きました。
最初のソースだと、app.record.edit.change.実施予定日 しか指定してないので、レコード編集画面でしか動かないと思いますが、そちらは想定通りでしょうか?
asagaさん
moment.jsを読み込ませるがよくわからなかったので、deveったらv4アップデートで読み込み不要に。。
他のアプリのスクリプトにmomentは使っていて動いているので、moment.js存在がわからないです。
https://developer.cybozu.io/hc/ja/articles/202960194
↑をCSSファイルに記載して使用するのですよね?
とりあえず現状、同じスクリプトを打ってみたのですが、
反応せず。
現状のスクリプトは以下になります。
(function () {
“use strict”;
kintone.events.on(‘app.record.edit.change.実施予定日’, function (event) {
const tableDate = event.record.実施予定と日付.value;
const dates = tableDate.map(function (cur){
return new Date(cur.value.実施予定日.value);
});
const maxDate = new Date(Math.max.apply(null,dates));
event.record[‘最終実施日’].value = moment(maxDate).format(“YYYY-MM-DD”);
return event;
});
})();
asagaさんが記載してくださったことそのままです。
とりあえず今後は編集時しか使用しないので、大丈夫です!
新規でやらなきゃのときはcreate.change入れます。
前あんなにcreateこだわってましたから、覚えていてくださって嬉しいです。
ありがとうございます。
こもるーさん
"v4アップデートで不要"になったのは、FullCalendarを使っている場合だと思いますー。
なので、moment.jsの箇所に書いてあるURL(https://js.cybozu.com/momentjs/2.24.0/moment-with-locales.min.js)をkintoneに読み込ませる必要があるのですが、
「アプリの設定 > JavaScript / CSSでカスタマイズ」でURL指定すればOKです。(CSSじゃなくてJavaScriptの方です)
注意する点としては、元々作っていたJavaScriptファイルよりも先に読み込ませておかないといけないので、
上記の画面のように、順番が上になるようにしておきます。
もしこれでも駄目でしたら、実際に格納されている値をチェックした方が良いと思います。
ご存知かもれしれませんが、ソース上にconsole.log(dates);とかconsole.log(maxDate);とか書けば、ブラウザのコンソールで入ってる値が確認できます。
引き続き頑張って下さい!
asagaさん
教えて頂いてできました!
画像も張り付けて頂いて申し訳ありません。
分かりやすかったのでとても助かりました。
そしてそれだけではなく、↑のスクリプトでちゃんと値が動きました!
>↑をCSSファイルに記載して使用するのですよね?
moment.jsって言ってるのにCSSを言うなんて私はなにを言っているんでしょうね。
重ね重ねすみませんでした。
>これが上手くいったあとは、別のフィールドへ次の予定月を記載したいと思っておりますが、予定月に関しましては、
このあとまた調べてみて頑張ってみるのですが、序盤に言っていた↑のスクリプトも動かないという現実に立ち向かっているので、
お手すきでしたらばまた救いの手を差し伸べて頂けませんでしょうか?
宜しくお願いします。
こもるーさん
うまくいったようで良かったです!
「別のフィールドへ次の予定月を記載したい」については、どのような動きを想定されているのでしょうか?
asagaさん
いつも大変お世話になっております、こもるーです。
返信が遅くなってしまい、申し訳ありません。
ログインしていると頼ってしまうと思ったので、一生懸命考えていたのですが、うまくいかず。。
いっそ考えを変えてみたのですが、そちらがわからなく教えて頂きたいです。
テーブル上に有無を調べる項目を用意しました。
ただし、有、無が混ざっています。
1つでも有がある場合、外のフィールドに有、1つもなければ無と記載するには、どうスクリプトを組んだら良いのでしょうか?
初心故、someを使用し、
var items = テーブル内有無欄;
var result = items.some,function(event){
return value === ‘有’;
});
からの表記なのだと想像しており、それから出てきた答えを見て有に置き換えるのか、それとも、はじめからIFで組むのか、と考えておりますが、
肝心のスクリプトがわからないです。この考えが合ってるかもわからず、お恥かしい限りですが、ご教授の程、宜しくお願い致します。
こもるーさん、こんにちは。
記載頂いたのは「別のフィールドへ次の予定月を記載したい」の件でしょうか?
ちょっと実現したい事が分からなくなってきたので、記載頂けると助かりますm(_ _)m
asagaさん
お世話になっております、こもるーです。
すみません。全然内容変わってます。
「別のフィールドへ次の予定月を記載したい」の件が自分のスキルにおいての断念もそうなのですが、
仕様上無くすことになってしまいました。都合のいい話で申し訳ないのですが、「別のフィールドへ次の予定月を記載したい」を
なかったことにしてくださると助かります。
そのあと、では有無確認を入れる、ということになり、有が一つでもあれば有という入力をしたいと思いまして、
先に返信した内容の質問となってしまいました。
色々省いてしまっている且つ、ごちゃごちゃさせてしまい、申し訳ありませんでした。
こもるーさん、こんにちは。
なるほど、そうなるとテーブル内に有無が無くても、できそうな気がしますね。
テーブルには日付を持っていて、テーブル外にチェック結果(有無)を入れる構造だった場合、こんな感じでいけるのでは無いでしょうか。
kintone.events.on('app.record.edit.change.実施予定日', function (event) {
const tableDate = event.record.Table.value;
const result = tableDate.some(function (cur){
// 入力した日付を消すとundefinedが返る
return (cur.value.実施予定日.value !== '' && typeof cur.value.実施予定日.value !== 'undefined');
});
if (result) {
event.record['テーブル外有無欄'].value = '有';
} else {
event.record['テーブル外有無欄'].value = '無';
}
return event;
});
インデントがおかしかったのでもう一度。
kintone.events.on('app.record.edit.change.実施予定日', function (event) {
const tableDate = event.record.Table.value;
const result = tableDate.some(function (cur){
// 入力した日付を消すとundefinedが返る
return (cur.value.実施予定日.value !== '' && typeof cur.value.実施予定日.value !== 'undefined');
});
if (result) {
event.record['テーブル外有無欄'].value = '有';
} else {
event.record['テーブル外有無欄'].value = '無';
}
return event;
});
asagaさん
凄いっす。できました!!
ありがとうございます!
私のふわっとした話をこんなに実現して頂いてありがとうございました!
上記のアプリ上と関係のない話で、スクリプトに対しての質問なのですが、
本当に有無確認があるテーブルに対してはどのような動きになるのでしょうか?
>return (cur.value.実施予定日.value !== ‘’ && typeof cur.value.実施予定日.value !== ‘undefined’);
このへんが
return (cur.value.実施予定日.value !== ‘有’ && typeof cur.value.実施予定日.value !== ‘無’);
にはなるかなと思うんですけど、「1つでも有ならば」という内容だと出てこなくて。。
〇〇が1つでも入っていれば有にする、みたいな内容が多いつくりになっているものが結構多く応用していければと思って質問させて頂きました。
こもるーさん
動いたようで良かったです!
テーブル内のフィールドに有無が入ってる場合ですが、
return cur.value.テーブル内有無欄.value === '有';
のようにすればいけると思います。
(テーブル内にある「テーブル内有無」フィールドに"有"があったら、その時点でtableDate.some()が終わって、最後のif文が処理されます)
asagaさん
本当に助かりました!いい動きしてます(笑)
テーブル内フィールドのお話で、↑でつかったアプリにそのまま追加してみたのですが、
kintone.events.on(‘app.record.edit.change.テーブル内有無欄’, function (event) {
const tableDate = event.record.てーぶる.value;
const result = tableDate.some(function (cur){
return cur.value.テーブル内有無欄.value === ‘有’;
});
if (result) {
event.record[‘テーブル外有無欄’].value = ‘有’;
} else {
event.record[‘テーブル外有無欄’].value = ‘無’;
}
return event;
});
にしたのですが、有が入っていても、全部無になっていても値が入らないです。
コンソールもエラーが出ておらず。。
この場合どのような原因が考えられますでしょうか?
こもるーさん
なんでしょうね・・・。
デバッグしながらどこまで動いているかを確認頂くのが確実かと思います。
イベントは動いているのか、テーブルの値は取れているか、resultには何が入ってるか・・・といった感じです。
asagaさん
お世話になっております、こもるーです。
上記件解決しました!何故昨日コンソールでエラーが出なかったのかわからないのですが、
ありがちな「フィールドコードが違う名称になっていた」というミスでした!
お騒がせしました。。
けれどもこれでたくさんのことに活かせます!
凄く長い間親身になっていただき、どうもありがとうございました!!
system
(system)
クローズされました:
20
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。