Javascript GoogleSheets脚本:从同一变量的rangelist中的每个范围获取值
我试图从图纸的两个不同部分获取范围,并将它们的值粘贴到另一张图纸上。我使用的方法适用于第一个范围,但不适用于下一个范围。我需要两个范围中的值保持在同一个变量中,因为我以后需要对其进行过滤Javascript GoogleSheets脚本:从同一变量的rangelist中的每个范围获取值,javascript,google-apps-script,google-sheets,google-sheets-api,Javascript,Google Apps Script,Google Sheets,Google Sheets Api,我试图从图纸的两个不同部分获取范围,并将它们的值粘贴到另一张图纸上。我使用的方法适用于第一个范围,但不适用于下一个范围。我需要两个范围中的值保持在同一个变量中,因为我以后需要对其进行过滤 var fromsh = SpreadsheetApp.openById(id).getSheetByName("Sheet1"); var fromval = fromsh.getRangeList(['A3170:O', 'Y3170:Y']).getRanges() var values = []
var fromsh = SpreadsheetApp.openById(id).getSheetByName("Sheet1");
var fromval = fromsh.getRangeList(['A3170:O', 'Y3170:Y']).getRanges()
var values = [];
for(var i = 0; i < fromval.length; i++){
values = [].concat(values, fromval[i].getValues());
}
tosh = SpreadsheetApp.openById(id).getSheetByName("Sheet1");
tosh.getRange(1, 1, values.length, values[0].length).setValues(values);
var fromsh=SpreadsheetApp.openById(id).getSheetByName(“Sheet1”);
var fromval=fromsh.getRangeList(['A3170:O','Y3170:Y'])。getRanges()
var值=[];
for(var i=0;i
显示的错误是:
数据中的列数与范围中的列数不匹配。数据有1,但范围有15。- 您希望将值置于
和A3170:O
范围内Y3170:Y
- 您希望使用谷歌应用程序脚本实现这一点
A3170:O
和Y3170:Y
之间的列数不同。这样,tosh.getRange(1,1,values.length,values[0].length).setValues(values)出现错误
解决方案:
为了避免上述问题,以下修改如何
模式1:
在此模式中,您的脚本是使用电子表格服务修改的。请修改如下
发件人:
致:
- 使用Sheets API时,可以在不调整每个元素长度的情况下输入值
- 使用时,请设置
id
A3170:O
和Y3170:Y
中的值相加。例如,A3170:O3170和Y3170
对于这种情况,请修改如下
模式3:
在此模式中,您的脚本是使用电子表格服务修改的。请修改如下
发件人:
致:
- 您希望将值置于
和A3170:O
范围内Y3170:Y
- 您希望使用谷歌应用程序脚本实现这一点
A3170:O
和Y3170:Y
之间的列数不同。这样,tosh.getRange(1,1,values.length,values[0].length).setValues(values)出现错误
解决方案:
为了避免上述问题,以下修改如何
模式1:
在此模式中,您的脚本是使用电子表格服务修改的。请修改如下
发件人:
致:
- 使用Sheets API时,可以在不调整每个元素长度的情况下输入值
- 使用时,请设置
id
A3170:O
和Y3170:Y
中的值相加。例如,A3170:O3170和Y3170
对于这种情况,请修改如下
模式3:
在此模式中,您的脚本是使用电子表格服务修改的。请修改如下
发件人:
致:
我可能弄错了,但OP可能希望行水平堆叠,而不是垂直堆叠,即A3170:O3170、Y3170或A3170:Y3170,不包括P3170:W3170。“不过我只是猜测而已。”校长感谢您的支持。当我再次检查OP的问题时,我同意你的建议。所以我又添加了一个示例脚本。你能确认一下吗?我希望OP的解决方案包含在这些示例中。太棒了
代码>@TheMaster非常感谢。我更新了更简单的修改。我可能弄错了,但OP可能希望行水平堆叠,而不是垂直堆叠,即A3170:O3170、Y3170或A3170:Y3170,不包括P3170:W3170。“不过我只是猜测而已。”校长感谢您的支持。当我再次检查OP的问题时,我同意你的建议。所以我又添加了一个示例脚本。你能确认一下吗?我希望OP的解决方案包含在这些示例中。太棒了代码>@TheMaster非常感谢。我更新了更简单的修改。我的答案是否显示了你想要的结果?你能告诉我这件事吗?这对我的学习也很有用。如果这样做有效,其他与你有相同问题的人也可以将你的问题作为可以解决的问题。如果你对我的回答还有疑问,我道歉。那时候,我可以问一下你目前的情况吗?我想学习来解决你的问题。我的回答告诉你你想要的结果了吗?你能告诉我这件事吗?这对我的学习也很有用。如果这样做有效,其他与你有相同问题的人也可以将你的问题作为可以解决的问题。如果你对我的回答还有疑问,我道歉。那时候,我可以问一下你目前的情况吗?我想学习来解决你的问题。
var values = [];
for(var i = 0; i < fromval.length; i++){
values = [].concat(values, fromval[i].getValues());
}
var obj = fromval.reduce(function(o, r) {
var v = r.getValues();
if (o.cols < v[0].length) o.cols = v[0].length;
o.values = [].concat(o.values, v);
return o;
}, {cols: 0, values: []});
var values = obj.values.map(function(e) {
return e.length == obj.cols ? e : e = [].concat(e, Array.apply(null, new Array(obj.cols - e.length)).map(function(e) {return ""}));
});
tosh = SpreadsheetApp.openById(id).getSheetByName("Sheet1");
tosh.getRange(1, 1, values.length, values[0].length).setValues(values);
Sheets.Spreadsheets.Values.update({values: values}, id, "Sheet1!A1", {valueInputOption: "USER_ENTERED"});
values = [].concat(values, fromval[i].getValues());
var temp = fromval[i].getValues();
values = i === 0 ? temp : values.map(function(e, i) {return [].concat(e, temp[i])});