【问题标题】:Unable to ignore formula column in google sheets无法忽略谷歌表格中的公式列
【发布时间】:2021-05-21 16:31:41
【问题描述】:

较新的 google sheet/java 脚本.. 在下面的函数中,它正确地从源表中获取数据并将其正确输入到目标上的下一个可用单元格中。但是,我在整个工作表的 F 列单元格中有一个公式。随着 getLastRow 的工作,数据被粘贴到工作表的下方。我需要将哪些内容更改为以下函数中的内容以忽略检查中的 F 列?

function CopyTime() {
  var sourceSheet = "Data";
  var sourceCell = "E61";
  var destinationSheet = "Log";
  var destinationCell = "E6";
  var ss = SpreadsheetApp.getActive();
  var sourceValue = ss.getSheetByName(sourceSheet).getRange(sourceCell).getValue();
  var destSheet = ss.getSheetByName(destinationSheet);
  var destRange = destSheet.getRange(destinationCell);
  var destRow = destRange.getRow();
  var destCol = destRange.getColumn();
  var destValues = destSheet.getRange(destRow, destCol, Math.max(1, destSheet.getLastRow() - destRow + 1)).getValues();
  for (var i = destValues.length - 1; i >= 0; i--) {
    if (destValues[i]) break;
  }
  if (destValues[i] != "") i = i + 1;
  destSheet.getRange(destRow + i, destCol).setValue(sourceValue);
}

【问题讨论】:

  • 我看不到函数在哪里与 F 列交互。
  • 是的,这就是问题所在,我没有告诉它。 F 列只有一个公式,它从 E 列的相邻单元格中获取数据并输出一个值。但如果有公式,则 E 值将写入下一行。
  • 除非你能更好地解释或提供正在发生的事情的例子,否则我无法帮助你。
  • Ok Ill tr​​y... 上面的函数从数据表中获取一个值,然后将内容复制到日志表,预计将粘贴到下一个可用行的 E 列。假设下一个可用行是 6,因为 E6 中当前没有数据。如果在运行上述函数时 F6 中有公式,则数据不会进入 E6,而是输入 E7 或下一行没有 F 中的公式。在我的工作表中,我有公式进入 F 列,单元格 1-20。如果我运行上面的 E 列函数,数据将输入到 E21 中。这有帮助吗?
  • 为什么因为公式不去E6?公式是什么?

标签: google-apps-script


【解决方案1】:

问题在于条件语句

如果我理解正确,您是在尝试用 E 列中的值识别最后一行,以便您可以在其后输入一个值。

for (var i = destValues.length - 1; i >= 0; i--) {
    if (destValues[i]) break;
}

具体来说,问题出在条件if (destValues[i])

说明

如您所知,当您从工作表中获取值时,您会得到一个二维数组。在这个函数中,你只是得到 E 列,但它仍然返回一个二维数组:

[
    [ 'Content' ],
    [ '' ],
    [ '' ],
    [ '' ],
    [ '' ],
    [ '' ],
    [ '' ],
    [ '' ],
    [ '' ],
]

你的方法是向后循环这个数组,得到包含内容的单元格的索引号。

当你写下你的条件时,我相信你假设了以下内容:

  1. 如果[ '' ] == falsetrue
  2. 然后if ([ '' ]) break 将评估为false 而不是break

但是,如果您使用Boolean 函数单独模拟if ([ '' ]),这似乎是合理的:

Boolean([ '' ]) // this produces true!

所以你的脚本会测试最后一行和break,这就是为什么它被放到最后一行。 (我真的不明白公式与这个有什么关系)。

当从这个上下文中得出这个相等时,诚然是出乎意料的。尽管如果您考虑经常要测试数组是否为空,这很有意义。 [''] 是一个包含一个元素的数组,因此将其视为 true 是有一定逻辑的,但将其视为 false 也可能是合乎逻辑的。

不幸的是,这就是 JavaScript 有很多这些意想不到的布尔转换问题的原因,所以我的建议是,在使用 JavaScript 开发时,请仔细检查你对什么等于什么的假设!

(试试谷歌“Javascript 平等模因”)

解决方案

// ...

console.log("searching for non empty cell")
for (var i=destValues.length-1;i>=0;--i) {
  if (destValues[i][0] != "") {
    console.log("found non empty row!")
    break
  };
}

// ...

参考

【讨论】:

  • 太棒了,我可以尝试一下,它按预期工作。感谢您为我解决这个问题。在 JS 中使用布尔值时,我必须牢记这一点。
猜你喜欢
  • 1970-01-01
  • 2021-05-03
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 2021-01-14
  • 2016-07-27
相关资源
最近更新 更多