Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用getValue和数组值位置(GAS)获取变量中的值有什么区别吗?_Javascript_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript 使用getValue和数组值位置(GAS)获取变量中的值有什么区别吗?

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中有一个整数值“45678.25”。
最初,我将使用下面的命令将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