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])});