我有一张 TAB A 和 TAB B 的表格。
我想循环遍历 TAB A 并获取我想要粘贴在 TAB B 中的值矩阵。
抛出错误,"无法读取属性1等
function getValuesFromModal(form) {
var IdeasCounter = 0;
const IDEA = 10,
PROD = 26,
PROM = 20,
CLIENT = 4,
ORANGE = "#e69138",
GREEN = "#6aa84f",
RED = "#e06666";
var rangeSource = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Records").getRange("A2:V").getValues();
var rangeDest = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Board").getRange("A2:E");
for (i in rangeSource) {
if (rangeSource[i][0] == "Ideas" && (!isNaN(parseInt(rangeSource[i][17])))) {
rangeDest[IdeasCounter][0].setValue("( " + rangeSource[i][2] + " )" + "\n" + rangeSource[i][3] + "\n\n" + "[ " + rangeSource[i][17] + " ]");
switch (rangeSource[i][17]) {
case rangeSource[i][17] < (IDEA - 2):
rangeDest[IdeasCounter][0].setBackground(GREEN);
break;
case rangeSource[i][17] > (IDEA):
rangeDest[IdeasCounter][0].setBackground(RED);
break;
case rangeSource[i][17] < (IDEA):
rangeDest[IdeasCounter][0].setBackground(ORANGE);
break;
}
IdeasCounter++;
}
}
}
&#13;
答案 0 :(得分:0)
我发现您的脚本存在一些问题,并相应地对其进行了修改:
for..in
,而不是实际范围。 然后,我为目标值和单元格背景创建了新数组。这是必要的,以便在运行脚本时,不会覆盖以前存在的值和背景颜色。此外,迭代范围值的数组是 much faster ,而不是遍历范围。
您使用的是Range
循环,但您不应该在此处执行此操作。相反,使用顺序for循环。请查看this great answer以了解原因。 (另外,您无法使用数组[][]
表示法遍历Google sourceValues[i][17]
类。您必须在范围内使用非常慢的getCell()
方法,但它是 vveeerrryyy ssssllooowwww 。)
我将sourceValues[i][*]
保存到自己的变量中,但理想情况下,您应该为其他switch
值执行此操作,因为它更易于阅读和维护。
<
语句不正确,因为它并不真正意味着处理>
/ function getValuesFromModal(form) {
var IdeasCounter = 0;
const IDEA = 10,
PROD = 26,
PROM = 20,
CLIENT = 4,
ORANGE = "#e69138",
GREEN = "#6aa84f",
RED = "#e06666";
var sourceValues = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Records").getRange("A2:V").getValues();
var destRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Board").getRange("A2:A"); // Looked like you were only writing to column A
var destNewValues = destRange.getValues();
var destBackgrounds = destRange.getBackgrounds();
for (var i=0; i<sourceValues.length; i++) {
var ideaValue = sourceValues[i][17];
if (sourceValues[i][0] == "Ideas" && (!isNaN(parseInt(ideaValue)))) {
var destValue = "( " + sourceValues[i][2] + " )\n" + sourceValues[i][3] + "\n\n[ " + ideaValue + " ]";
destNewValues[i][0] = destValue;
if (ideaValue < (IDEA - 2)) { // Right now excluding ideaValue == 10
destBackgrounds[i] = [GREEN];
} else if (ideaValue > IDEA) {
destBackgrounds[i] = [RED];
} else if (ideaValue < IDEA) {
destBackgrounds[i] = [ORANGE];
}
}
}
destRange.setValues(destNewValues).setBackgrounds(destBackgrounds);
}
比较。再一次,别人对你如何做到这一点的解释,以及为什么你不应该做到这一点比我的好;你可以阅读here。
然后我使用了batch operations,因为它们更快,write the destination value和set the cell background colors。
修改后,结果如下:
ng test