我的云端硬盘中有2个电子表格。我想从1个电子表格中的单元格中提取数据并将其复制到另一个电子表格中。 电子表格“TestUsage”有时会在A列中有数据,但没有一列是B列。 我想这样,当我打开电子表格时,它会从表单“TestParts”填充表单“TestUsage”中的空单元格。 这是我的代码:
var ssTestUsage = SpreadsheetApp.getActiveSpreadsheet();
var sTestUsage = ssTestUsage.getActiveSheet();
var lastRowTestUsage = sTestUsage.getLastRow();
var rangeTestUsage = sTestUsage.getSheetValues(1, 1, lastRowTestUsage, 4);
var TESTPARTS_ID = "1NjaFo0Y_MR2uvwit1WuNeRfc7JCOyukaKZhuraWNmKo";
var ssTestParts = SpreadsheetApp.openById(TESTPARTS_ID);
var sTestParts = ssTestParts.getSheets()[0];
var lastRowTestParts = sTestParts.getLastRow();
var rangeTestParts = sTestParts.getSheetValues(1, 1, lastRowTestParts, 3);
function onOpen() {
for (i = 2; i < lastRowTestUsage; i++) {
if (rangeTestUsage[i][0] !== "" && rangeTestUsage[i][1] == "") {
for (j = 1; j < lastRowTestParts; j++) {
if (rangeTestUsage[i][0] == rangeTestParts[j][0]) {
Logger.log(rangeTestUsage[i][1]);
Logger.log(rangeTestParts[j][1]);
rangeTestUsage[i][1] = rangeTestParts[j][1];
break;
}
}
}
}
}
这个问题是这没有做任何事情:
rangeTestUsage[i][1] = rangeTestParts[j][1];
我知道必须有一种方法可以将数据从一个范围获取到另一个范围。 如果我完全错误或者我走在正确的道路上,请告诉我。
答案 0 :(得分:1)
声明
“这没有做任何事情:”
rangeTestUsage[i][1] = rangeTestParts[j][2];
不是真的......而且也不是真的假......实际上它确实将值赋给rangeTestUsage i,但你没有看到它,因为它没有反映在电子表格中。
这两个值都是使用getValues
从Sheet中获取的,所以那时它们都是数组元素。
缺少的是使用对称语句setValues()
尝试一下,如果出现问题,请不要犹豫回来。
编辑:
我一开始并没有注意到您使用的是getSheetValues
而不是getValues
(仅仅因为我从未使用过这个)...唯一的区别是getValues是{的方法{3}}虽然您属于range class;语法在某种程度上是相似的,只需使用
Sheet.getRange(row,col,width,height).getValues()
它需要多一个字,但有一个优势就是直接等同于设定值
Sheet.getRange(row,col,width,height).setValues()
答案 1 :(得分:0)
Serge insas对您的代码无效的原因有很好的解释,并提示下面的解决方案。
我建议你使用数组存储你想要的B列的更新值,然后在最后设置整个列。
var ssTestUsage = SpreadsheetApp.getActiveSpreadsheet();
var sTestUsage = ssTestUsage.getActiveSheet();
var lastRowTestUsage = sTestUsage.getLastRow();
var rangeTestUsage = sTestUsage.getSheetValues(1, 1, lastRowTestUsage, 2);
var TESTPARTS_ID = "1NjaFo0Y_MR2uvwit1WuNeRfc7JCOyukaKZhuraWNmKo";
var ssTestParts = SpreadsheetApp.openById(TESTPARTS_ID);
var sTestParts = ssTestParts.getSheets()[0];
var lastRowTestParts = sTestParts.getLastRow();
var rangeTestParts = sTestParts.getSheetValues(1, 1, lastRowTestParts, 2);
var colB = [];
function onOpen() {
for (i = 2; i < lastRowTestUsage; i++) {
if (rangeTestUsage[i][0] !== "" && rangeTestUsage[i][1] == "") {
var matched = false;
for (j = 1; j < lastRowTestParts; j++) {
if (rangeTestUsage[i][0] == rangeTestParts[j][0]) {
//Logger.log(rangeTestUsage[i][1]);
//Logger.log(rangeTestParts[j][1]);
colB.push([rangeTestParts[j][1]]); // push the value we want into colB array
matched = true;
break;
}
}
if(!matched) // this is in case you don't have a match
colB.push([""]); // incase we don't have a matching part
} else {
colB.push([rangeTestUsage[i][0]]); // we already have a value we want so just add that to colB array
}
}
sTestUsage.getRange(2,2,lastRowTestUsage).setValues(colB); // update entire column b with values in colB array
}