Javascript 使用getValue和数组值位置(GAS)获取变量中的值有什么区别吗?
假设我在谷歌表单的单元格A10中有一个整数值“45678.25”。Javascript 使用getValue和数组值位置(GAS)获取变量中的值有什么区别吗?,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,假设我在谷歌表单的单元格A10中有一个整数值“45678.25”。 最初,我将使用下面的命令将A10中的值赋给一个变量: 方法1: var myitem=sheet.getRange(10,1).getValue() 然后我注意到我也可以使用下面的命令执行同样的操作: 方法2: 我计划在我所有的自定义函数中都从方法1(getValue)更改为方法2(在DataRange中按值位置调用),因为我觉得它看起来更整洁。但这样做安全吗?是否会对最终结果/输出产生任何影响 我创建了带有输出的采样测试代码,
最初,我将使用下面的命令将A10中的值赋给一个变量:
方法1:
var myitem=sheet.getRange(10,1).getValue()代码>
然后我注意到我也可以使用下面的命令执行同样的操作:
方法2:
我计划在我所有的自定义函数中都从方法1(getValue)更改为方法2(在DataRange中按值位置调用),因为我觉得它看起来更整洁。但这样做安全吗?是否会对最终结果/输出产生任何影响
我创建了带有输出的采样测试代码,以表明对输出有重大影响
方法1的采样代码:
function checker(){
var ss=SpreadsheetApp.openById('SHEET_ID').getSheetByName('mystaff'),
staffdata=ss.getDataRange().getValues(),
lastrow=ss.getLastRow(),
staffID=ss.getRange(lastrow,1).getValue(),
name=ss.getRange(lastrow,4).getValue(); // Marlina
ss.getRange(lastrow,2).setFormula('=COUNTIF($D1:D'+lastrow+',D'+lastrow+')') // 2
ss.getRange("mystaff!B"+lastrow+":B"+lastrow).copyTo(ss.getRange("mystaff!B"+lastrow), {contentsOnly: true});
//Method 1
var RFQ=ss.getRange(lastrow,2).getValue();
console.log("RFQ by getValue:"+RFQ); // 2
//end of Method 1
if(staffID==""){
if(RFQ>1){
staffID=name.slice(0,3).toUpperCase();
console.log("moreRFQ :"+RFQ);
staffID=staffID+'('+RFQ+')';
Logger.log("newstaffID : "+staffID);
}else{
staffID=name.slice(3,5).toUpperCase();
console.log("firstRFQ :"+RFQ);
staffID=staffID+'('+RFQ+')';
Logger.log("newstaffID : "+staffID);
}
}
ss.getRange(lastrow,1).setValue(staffID); // output : MAR(2)
}
方法2的采样代码:
function checker(){
var ss=SpreadsheetApp.openById('SHEET_ID').getSheetByName('mystaff'),
staffdata=ss.getDataRange().getValues(),
lastrow=ss.getLastRow(),
staffID=ss.getRange(lastrow,1).getValue(),
name=ss.getRange(lastrow,4).getValue(); // Marlina
ss.getRange(lastrow,2).setFormula('=COUNTIF($D1:D'+lastrow+',D'+lastrow+')') // 2
ss.getRange("mystaff!B"+lastrow+":B"+lastrow).copyTo(ss.getRange("mystaff!B"+lastrow), {contentsOnly: true});
//Method 2
var RFQ=staffdata[lastrow-1][1];
console.log("RFQ by array:"+RFQ); // blank
//end of Method 2
if(staffID==""){
if(RFQ>1){
staffID=name.slice(0,3).toUpperCase();
console.log("moreRFQ :"+RFQ);
staffID=staffID+'('+RFQ+')';
Logger.log("newstaffID : "+staffID);
}else{
staffID=name.slice(3,5).toUpperCase();
console.log("firstRFQ :"+RFQ);
staffID=staffID+'('+RFQ+')';
Logger.log("newstaffID : "+staffID);
}
}
ss.getRange(lastrow,1).setValue(staffID); // output : LI()
}
尽管输入源相同,但不同的输出实际上是由它基于IF..ELSE结果运行的不同子函数引起的。我很好奇为什么会这样?欣赏一些逻辑解释。谢谢。这样做是安全的,不会影响最终结果或输出
就性能而言,在处理大数据时,一次获取所有数据是非常困难的。但是,如果您只需要特定的范围,请只获取包含所有所需范围的范围,而不是所有dataRange。如果需要A1、C1和B5,可以获取,getRange(“A1:C5”).getValues()
并相应地索引到结果数组中
根据更新的代码,两个检查器
函数之间还有另一个区别:这里的混淆变量是时间
在方法1中
//Bunch of operations affecting the B column of range
var RFQ=ss.getRange(lastrow,2).getValue();
console.log("RFQ by getValue:"+RFQ); // 2
RFQ
值是在执行一系列其他操作后检索的
在方法2中
staffdata=ss.getDataRange().getValues(),
//Bunch of operations affecting Col B of last row
//Method 2
var RFQ=staffdata[lastrow-1][1];
staffdata
在对工作表进行任何更改之前检索值
要消除混淆变量并使两个测试相互关联,请同时使用方法2中的getValues()
/方法1的getValue()
中的行
//Bunch of operations affecting Col B of last row
//Method 2
const staffdata = ss.getDataRange().getValues();
const RFQ=staffdata[lastrow-1][1];
或者,为了使测试无偏
var RFQ=ss.getRange(lastrow,2).getValue();// moved up
//Bunch of operations affecting the B column of range
console.log("RFQ by getValue:"+RFQ); // 2
如果您只得到一个值,代码通常会更简单,我怀疑会更快,但我不确定。你可以自己测试一下。关键是要认识到,如果要处理大量的值,那么将它们放入一个数组来处理它们会快得多。因此,在工作表中明智地放置它们确实可以加快脚本的性能。但是你可以在任何给定的情况下自己测试。为什么你不为你的特定测试用例找出两种方法之间的执行时间,看看哪种方法最适合你?好吧,更快的过程是一个额外的好处,但我更担心它是否会影响最终结果。我刚刚注意到,在我的一个自定义函数中,当我使用方法2时,当我将console.log放在命令下面时,当我多次测试运行时,变量中的值不一致,这导致输出不一致。我想知道为什么,但当我使用方法1时,这种情况并没有发生。许多人误解了海关职能。请添加一个,以便更好地了解您的问题和顾虑。此外,加速气体还有每秒可执行的getValue()
数量的限制。因此,如果您处理一个包含多个单元格的大表,那么一次性获取这些单元格是非常有意义的。添加@TheMaster之后,恐怕我不同意您的意见。好的,似乎每次对上一个值执行操作时,我都必须重复声明数据范围,否则变量RFQ将不会更新。如果是这种情况,方法2只会增加更多的代码行,而不是减少代码行(getValue命令将在操作后为我提供最新的值,因为它是在范围更新后调用的。现在我清楚地理解了为什么它会产生差异,我认为通过这一发现,我认为使用方法1更安全。非常感谢您花时间向我澄清这一点,@TheMaster。非常感谢h!@dell Method2更干净、更快。如果您想让它成为一行,请使用ss.getDataRange().getValues()[lastrow-1][1]
。此外,不要混合使用公式和脚本。事实上,在获得值后不要触摸电子表格。请参阅练习数组。不要做得更安全。冒险,因为回报值得冒险。
var RFQ=ss.getRange(lastrow,2).getValue();// moved up
//Bunch of operations affecting the B column of range
console.log("RFQ by getValue:"+RFQ); // 2