functionをまたぐ?varで定義した内容の使用について

とんちんかんな質問でしたらすみません。

同じjsファイル?に2個functionがあり、

①元レコードを契約日欄(入力済み)に解約日付を新しく入力(上書き)

②元レコードの色々な項目を空白にして、同じように契約日欄に解約日付を上書き

上記2点の解約日付を入力させる際に、入力者に分かりやすいようにwindow.pronmtで入力させています。

var str = window.prompt(“解約日を入力してください。入力形式YYYY-MM-DD(例:2019-10-01)”, “YYYY-MM-DD”);
record[‘契約日’].value = str;

上のvarで定義している内容は①に書いている内容で、そのまま②の中に引っ張ってくるよう record[‘契約日’].value = str; を書いてみたんですが、

特にエラーも出ず、他部分で書いている処理は動いているので、

スルーされている?ように見えています。

②の時も同じようにwindow.promptにて入力させれば、実現できるんですが、

同じ内容を2回入れさせるのは手間だし、間違えそうなので

①の時に入力した内容を使いたいと思っています。

他処理も入っていて長くなるのでコードは載せていませんが、

前後が無いと分からない場合はまた貼り付けますので、

何か確認点などあれば教えて頂ければと思います。

よろしくお願いいたします。

こうしているけど、2でも引き継ぎたいということですか?

function test1() {
    var str = window.prompt("解約日を入力してください。入力形式YYYY-MM-DD(例:2019-10-01)", "YYYY-MM-DD");
    record['契約日'].value = str;
}

function test2() {
    record['契約日'].value = str;
}

2でも引き継ぎたい場合は、このように、外で変数を宣言してあげる必要があります。

var str;

function test1() {
    str = window.prompt("解約日を入力してください。入力形式YYYY-MM-DD(例:2019-10-01)", "YYYY-MM-DD");
    record['契約日'].value = str;
}

function test2() {
    record['契約日'].value = str;
}

 

PV様、またまたありがとうございます・・・

どうしても②の箇所で日付フィールドが空欄になってしまいます。

window.promptを②の上に持ってくると、①が空白・②は反映されるため、変数の定義がうまくいっていないのでしょうか?

以前別件で頂いたコードをいじくりまわしているので他の処理も入っていますが、現状以下のコードです。

 

var str;



(function () {

"use strict";


kintone.events.on('app.record.detail.show', function (event) {
// 任意のスペースフィールドにボタンを設置
var mySpaceFieldButton = document.createElement('button');
mySpaceFieldButton.id = 'my_space_field_button';
mySpaceFieldButton.innerText = '解約処理を始める';
mySpaceFieldButton.onclick = function () {

// 元レコードの引渡日をクリア(更新API)
var appId = kintone.app.getId();
var Id = kintone.app.record.getId();
var param = {
"app": appId,
"id": Id,
"record": {
"引渡日": {
"value": ""
},

}
};

kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', param, function(resp) {
 // 成功時の処理
console.log(resp);
}, function(error) {
 // エラー時の処理
console.log(error);
});


// マイナスレコードを作る処理開始
// 元のレコードをコピー
var record = JSON.parse(JSON.stringify(event.record));

// 元のレコードから、レコード番号は引き継がないのでクリア
delete record.レコード番号;

// 各数値が入っていたら値をマイナスにする。[]の中に、数値の"フィールドコード"を設定
['設定金額', '売上金額'].forEach(function (fieldCode) {
if (record[fieldCode]) {
record[fieldCode].value = parseInt(record[fieldCode].value) * -1;
}
});
// 引渡日を空白にする(マイナスレコード)
['引渡日'].forEach(function (fieldCode) {
record[fieldCode].value = "";
});

str = window.prompt("解約日を入力してください。入力形式YYYY-MM-DD(例:2019-10-01)", "YYYY-MM-DD");
record['契約日'].value = str;

// kintoneにマイナスのレコードを追加
kintone.api(kintone.api.url('/k/v1/record', true), 'POST', { app: kintone.app.getId(), record: record }).then(function () {
// 解約処理なのか、通常のコピーなのかの判断のためのフラグセット
sessionStorage.setItem('kintone_kaiyaku', "1");

//レコード再利用
var copy = document.getElementsByClassName('gaia-argoui-app-menu-copy gaia-argoui-app-menu');
copy[0].setAttribute("id", "copy");
document.getElementById("copy").click();
}).catch(function (err) {
alert('何らかの理由でマイナスレコードの作成に失敗');
console.log(err);
});
};

kintone.app.record.getSpaceElement('my_space_field').appendChild(mySpaceFieldButton);
});

kintone.events.on('app.record.create.show', function (event) {
if (event.reuse && sessionStorage.getItem('kintone_kaiyaku') === "1")
// 解約処理のフラグクリア
sessionStorage.clear();

var record = event.record;

// 解約処理の場合、画面の顧客情報の空白にする処理。[]の中に、顧客情報の"フィールドコード"を設定
['販社名', '名前','設定金額','引渡日','ルックアップ'].forEach(function (fieldCode) {
record[fieldCode].value = "";
});

record['ルックアップ']['lookup'] = 'CLEAR';
record['契約日']['value'] = str;



//window.alert('現在表示されている画面は、空室データです。次回の契約時に使用しますので、土地・建物など売買金額を確認後、[保存ボタン]を押してください。');

return event;
}
);
})();

貼っていただいたソースを見ると、

コピー処理が走るとき、ページがリロードされるため、変数が破棄されているようです。

その対策(画面間で変数を共有する場合)には、通常sessionStorageやlocalSotrage等を使用します。

 

値をセットする例)

sessionStorage.setItem(‘kintone_kaiyakubi’, str);     // kintone_kaiyakubiというキー名で、strの値を保存する。

値を取得する例)

sessionStorage.getItem(‘kintone_kaiyakubi’);           // kintone_kaiyakubiというキー名で保存していた値を取得する。

保存している値をすべてクリア)

sessionStorage.clear();

 

あと、ソースの以下の場所は{}括弧で括らないと、ifがtrueでもfalseでも、それ以降の処理が走ってしまいます。

(解約処理ではなく、通常の新規登録時も処理が走ってしまう。)

    if (event.reuse && sessionStorage.getItem('kintone_kaiyaku') === "1") { // ←@@@@@@@@@@ここから

        // 解約処理のフラグクリア
        sessionStorage.clear();

        var record = event.record;

        // 解約処理の場合、画面の顧客情報の空白にする処理。[]の中に、顧客情報の"フィールドコード"を設定
        ['販社名', '名前', '設定金額', '引渡日', 'ルックアップ'].forEach(function (fieldCode) {
            record[fieldCode].value = "";
        });

        record['ルックアップ']['lookup'] = 'CLEAR';
        record['契約日']['value'] = str;

        //window.alert('現在表示されている画面は、空室データです。次回の契約時に使用しますので、土地・建物など売買金額を確認後、[ 保存ボタン ]を押してください。');

        return event;
    } // ←@@@@@@@@@@ここ

できました・・・ありがとうございます;0;感動です;0;

 

最初に日付をstrへ定義して、そのstrをセットアイテムで保管して、

var str = window.prompt(“解約日を入力してください。入力形式YYYY-MM-DD(例:2019-10-01)”, “YYYY-MM-DD”);
sessionStorage.setItem(‘kintone_kaiyakubi’, str);

1個目の日付はstrで呼び出して、

record[‘契約日’].value = str;

2個目の日付はゲットアイテムで呼び出す

record[‘契約日’][‘value’] = sessionStorage.getItem(‘kintone_kaiyakubi’);

こんな形で思った通りの動作となりました!2個目もstrで呼び出そうとしてハマりかけました・・・

 

もう1点ご指摘頂いた{}についてですが、return event; の後に、 }); で閉じました。

JSEditでカーソルを合わせると、対応する括弧にマーク?網掛け?が付くので、括弧の対応はそれで確認するようにしています!