【问题标题】:How did getValues() in Google Apps Script return a 'undefined' value?Google Apps 脚本中的 getValues() 如何返回“未定义”值?
【发布时间】:2020-05-08 17:48:43
【问题描述】:

我试图计算一列中填充单元格的数量,一旦它为空,计数应该停止。因此,我强加了这个条件:

sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1')
numberOfRows = 0
while(sheet.getRange(2,1,sheet.getLastRow()-1,1).getValues()[numberOfRows] != '') {
  numberOfRows ++
}

我在 Google Apps Script 上打开了调试器,发现上面的 while 循环并没有停止。经过进一步测试,我发现空的单元格是“未定义的”,而不是它们应该返回的传统空字符串。单元格返回“未定义”而不是“”的任何可能原因?

【问题讨论】:

  • 调试器有问题。还有什么可以表明循环没有停止
  • 这是一个可怕的循环。您应该永远在循环中调用 getValues。调用一次并循环内容。 stackoverflow.com/questions/49020131/…
  • 当我暂停调试器时,numberOfRows 的值飙升至 ~600000。这表明while循环没有停止
  • @tehhowch 实际上,即使我将 getValues 放在顶部的另一个变量中,结果仍然相同:while 循环没有停止,空单元格仍然是“未定义”而不是传统的空字符串。

标签: string google-apps-script while-loop counter


【解决方案1】:

未定义的值不是问题,循环没有结束,因为每一行都是一个数组,一个数组永远不会等于''。

当代码调用sheet.getRange(2,1,sheet.getLastRow()-1,1).getValues()[numberOfRows] 时,返回值是一个列数组。如果您在范围内选择了 3 列,则一行将类似于:['A','B','C']

要访问行中列的值,您需要指定它的索引。在这种情况下,您只选择了一个列 (['A']),因此索引为 0。

或者,如果您首先将值放入变量中,您可能会发现代码更简洁,这是一种样式选择。

  var values = sheet.getRange(2,1,sheet.getLastRow()-1,1).getValues();
  var numberOfRows = 0;

  while(values[numberOfRows][0] != '' ){
     numberOfRows++;
  }

【讨论】:

    【解决方案2】:

    代码有一些问题:

    1. 如问题评论中所述,在循环中使用 getValues() 不是一个好主意
    2. 以下表达式无法在 Google Apps 脚本编辑器调试器中显示

      sheet.getRange(2,1,sheet.getLastRow()-1,1).getValues()[numberOfRows]
      
    3. 上述表达式返回一个数组,而不是单个值。
    4. 到达最后一行时循环不会停止。


    getValues() 返回undefined 的假设是错误的。这是由于numberOfRows 的值等于或大于getValues() 返回的元素数,因为JavaScript 数组索引从零开始。

    为了能够使用 Google Apps 脚本调试器,您应该添加更多代码行

    var values = sheet.getRange(2,1,sheet.getLastRow()-1,1).getValues();
    

    关于

    我试图计算一列中填充单元格的数量,一旦它为空,计数应该停止。

    我认为更好的措辞是“找到第一个空单元格”。无论如何,当到达该列的最后一行时,它也应该停止。

    var numberOfRows = 0;
    while(numberOfRows < values.length && values[numberOfRows][0] !== ''){
      numberOfRowss++;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多