首页 > 解决方案 > 循环问题的 Google 脚本

问题描述

所以这个问题似乎在黑板上被打死了,但是通过我所有的阅读和谷歌搜索,我无法弄清楚我做错了什么。

我正在尝试调整此链接中的代码 如何循环谷歌电子表格列值并在 B 列中设置结果?

下面是我已经适应的

function EquationIterationTest(){
  var s = SpreadsheetApp.getActiveSpreadsheet();
  var sht = s.getSheetByName('Heath, OH')
  var drng = sht.getDataRange();
  var rng = sht.getRange(13, 2, 111, 1)
  //.getRange(13, 2, drng.getLastRow()-1, drng.getLastColumn())
  var rngA = rng.getValues();//Array of input values

  Logger.log(rngA);

  for(var i = 0; i < rngA.length; i++) {
    if(rngA[i][0] === 'subtotal'){
    rng.offset(0,3).setFormula('=iferror(sum(filter(Invoices!$E:$E,Invoices!$F:$F=$B14,Invoices!$A:$A=$C$2)))');
    }
   else{
     rng.offset(0,3).setValue('Dumb');
   }
   }
 }

当我运行它时,rngA 确实获得了第一列值(在本例中从 B13 开始),但是它不会在第三列值中输入公式。相反,它直接通过第一个 if 语句并执行 else 语句。我唯一能想到的是我的 if 语句或数组有问题。

我尝试设置if(rngA[i][0] === 'subtotal')if(rngA[i][1] === 'subtotal'),但仍然在每一行返回“哑”。

任何帮助将不胜感激,这样我就可以停止“愚蠢”!

这是我的工作表的链接。

https://docs.google.com/spreadsheets/d/1cDkwWThXDTssH89gJX7W1zKzsW86oLXO-FPfAIJvc-g/edit?usp=sharing

谢谢

标签: google-apps-scriptgoogle-sheets

解决方案


问题不在于您的 if 条件,尽管如果您使用三个等号,您正在进行严格的比较,因此您的小计应该以大写字母开头。

也就是说,当您将值或公式分配给 时,您的问题就会发生rng.offset(0,3),因为该表达式的结果是一个范围,其大小与rng右侧偏移 3 列相同。您可以使用: 来验证这一点Logger.log(rng.offset(0,3).getA1Notation());,因此每当您在那里分配一个值或公式时,您就是将它分配给整个偏移量 rng。不是你想要的对吗?

在您的情况下,您应该使用offset()单个单元格,而不是整个范围。

您的功能可以简化为以下内容:

function EquationIterationTest(){
  var s = SpreadsheetApp.getActiveSpreadsheet();
  var sht = s.getSheetByName('Heath, OH')
  var rng = sht.getRange(13, 2, 111, 1)

  for(var i = 1; i <= rng.getNumRows(); i++) {
    var cell = rng.getCell(i,1);
    if(cell.getValue() === 'Subtotal'){
      cell.offset(0,3).setFormula(
        '=iferror(sum(filter(Invoices!$E:$E,Invoices!$F:$F=$B14,Invoices!$A:$A=$C$2)))'
      );
    }
    else{
      cell.offset(0,3).setValue('Dummy');
    }
  }
}

推荐阅读