【问题标题】:Google Sheets Script: Getting values from each range in a rangelist in the same variableGoogle表格脚本:从同一变量的范围列表中的每个范围获取值
【发布时间】:2019-08-02 09:02:24
【问题描述】:

我正在尝试从工作表的两个不同部分获取范围,并将它们的值粘贴到另一张工作表上。我使用的方法适用于第一个范围,但不适用于下一个。我需要两个范围内的值保持在同一个变量中,因为我需要稍后对其进行过滤。

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

显示的错误是: 数据中的列数与区域中的列数不匹配。数据有 1 但范围有 15。

【问题讨论】:

  • 我的回答是否向您展示了您想要的结果?你能告诉我吗?这对我学习也很有用。如果这可行,与您有相同问题的其他人也可以将您的问题作为可以解决的问题。如果您对我的回答有疑问,我深表歉意。到时候,我能问一下你现在的情况吗?我想学习解决你的问题。

标签: javascript google-apps-script google-sheets google-sheets-api


【解决方案1】:
  • 您希望输入A3170:OY3170:Y 范围内的值。
  • 您希望使用 Google Apps 脚本实现此目的。

如果我的理解是正确的,那么这个修改呢?请认为这只是几个答案之一。

问题:

在您的脚本中,A3170:OY3170:Y 的列数不同。这样,tosh.getRange(1, 1, values.length, values[0].length).setValues(values) 就会发生错误。

解决方案:

为了避免上述问题,下面的修改如何?

模式一:

在此模式中,您的脚本已使用电子表格服务进行了修改。请修改如下。

从:
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 ""}));
});
  • 获取最大列数,通过添加""调整数组每个元素的长度。然后,将这些值放入电子表格。

模式2:

在此模式中,您的脚本已使用 Sheets API 进行了修改。请修改如下。在运行此脚本之前,请在 Advanced Google services 启用 Sheets API。

从:
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"});
  • 使用 Sheets API 时,无需调整每个元素的长度即可放置值。
  • 使用时请设置id

参考资料:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

补充:

TheMaster's suggestion,我又添加了一个示例脚本。在这个示例脚本中,

A3170:OY3170:Y 范围内的值对列方向求和。例如,A3170:O3170 and Y3170

针对这种情况,请进行如下修改。

模式3:

在此模式中,您的脚本已使用电子表格服务进行了修改。请进行如下修改。

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

【讨论】:

  • 我可能弄错了,但 OP 可能希望行水平堆叠而不是垂直堆叠,即 A3170:O3170,Y3170 或 A3170:Y3170 不包括 P3170:W3170。不过我只是猜测。
  • @TheMaster 感谢您的支持。当我再次检查 OP 的问题时,我同意您的建议。所以我又添加了一个示例脚本。你能确认一下吗?我希望这些示例中包含 OP 的解决方案。
  • 太棒了
  • @TheMaster 非常感谢。我更新了更简单的修改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多