Google apps script Google web HTML应用程序中的值计算问题

Google apps script Google web HTML应用程序中的值计算问题,google-apps-script,Google Apps Script,我已经在谷歌脚本中创建了一个HTML web应用程序,它就像一个计算器,如果我按降序添加输入,这个应用程序工作得很好,但是如果我跳过顺序并在任何列中随机更新输入数据,那么我就无法正确获得输出 示例:-更新第4框和第5框中的数字,然后更新第1框中的数字,您将发现总数的差异 有关详细脚本,请参阅附页 $(“#rTpe1”).keyup(函数(e){ $(“#rFor1”).val(this.value*$(“#PerHourRate1”).val()); $(“#rFor3”).val(数字($

我已经在谷歌脚本中创建了一个HTML web应用程序,它就像一个计算器,如果我按降序添加输入,这个应用程序工作得很好,但是如果我跳过顺序并在任何列中随机更新输入数据,那么我就无法正确获得输出

示例:-更新第4框和第5框中的数字,然后更新第1框中的数字,您将发现总数的差异

有关详细脚本,请参阅附页

$(“#rTpe1”).keyup(函数(e){
$(“#rFor1”).val(this.value*$(“#PerHourRate1”).val());
$(“#rFor3”).val(数字($(“#rFor1”).val())+数字($(“#rFor2”).val())
});
$(“#rTpe2”).keyup(函数(e){
$(“#rFor2”).val(this.value*$(“#PerHourRate2”).val());
$(“#rFor3”).val(数字($(“#rFor1”).val())+数字($(“#rFor2”).val())
});
$(“#rTpe12”).keyup(函数(e){
$(“#rFor12”).val(this.value*$(“#PerHourRate3”).val());
$(“#rFor3”).val(数字($(“#rFor1”).val())+数字($(“#rFor2”).val())+数字($(“#rFor12”).val())
});
$(“#rTpe13”).keyup(函数(e){
$(“#rFor13”).val(this.value*$(“#PerHourRate4”).val());
$(“#rFor3”).val(数字($(“#rFor1”).val())+数字($(“#rFor2”).val())+数字($(“#rFor12”).val())+数字($(“#rFor13”).val())
});

我可能错了,但我认为这是罪魁祸首:

如果您的工作方式自上而下,则“#rFor3”中的输出不会受到影响。例如,如果在第一个字段(“#rTpe1”)中输入值,则此语句

Number($("#rFor2").val()))
将计算为“0”,因为“#rFor2”此时可能包含空字符串,数字(“”)将为零。由于所有后续输入字段都引用了以前的计算结果('rTpe2'引用了'rFor1''rTpe12'引用了'rFor1''rFor2'等),因此总和将是正确的

现在考虑反向方案。为了简单起见,让我们将所有费率都设为1。如果将“5”的值输入到'rTpe12'中,则'rFor3'的值将为

 Number("") + Number("") + Number(5*1) == 5; //the first two inputs will contain empty strings at this point
“#rFor3”的输出为5。如果向上一步并将“2”的值输入到'rTpe2',则'rFor3'输出的值将更改为

Number("") + Number(2*1) == 2; the first input will contain an empty string.

代码不易理解,因此即使该解决方案对您不起作用,也可以考虑缓存DOM元素以提高性能并使代码更可读。目前,您正在使用jQuery选择器反复搜索DOM,这是一个严重的性能拖累。您还可以将计算值存储为变量,只需向其中添加值,而不是对每个输入重新计算。比如说

$('document').ready(function(){

 var total = 0;
 var input1 = $('#input1');
 var input2 = $('#input1');
 var input3 = $('#input1');
 var output = $('#output');

 input1.keyup(function(e){

var value = Number(this.value);
sum += value;
output.val(sum);

});



});