较新的 google 表格/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);
}
答案 0 :(得分:0)
如果我理解正确的话,您正在尝试使用列 E 中的值标识最后一行,以便您可以在其后输入值。
for (var i = destValues.length - 1; i >= 0; i--) {
if (destValues[i]) break;
}
具体来说,问题在于条件 if (destValues[i])
如您所知,当您从工作表中获取值时,您会得到一个二维数组。在这个函数中,你只是得到 E 列,但它仍然返回一个二维数组:
[
[ 'Content' ],
[ '' ],
[ '' ],
[ '' ],
[ '' ],
[ '' ],
[ '' ],
[ '' ],
[ '' ],
]
您的方法是向后遍历此数组以获取包含内容的单元格的索引号。
当你写下你的条件时,我相信你假设了以下内容:
[ '' ] == false
是 true
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
};
}
// ...