【问题标题】:Best method to extract selected columns from 2d array in apps script从应用程序脚本中的二维数组中提取选定列的最佳方法
【发布时间】:2020-10-15 08:05:31
【问题描述】:

我正在使用谷歌应用程序脚本。如果我从 A1:E5 之类的范围开始,那就是一个 5x5 数组。 我想返回范围 C1:D5,一个 5x2 数组。从二维数组开始,只返回选定的“列”。基本上就是这样。 我认为这是一项基本操作,但我真的很挣扎。我在下面有我的代码,但我对任何使用数组的选项(而不是范围,以避免不必要地 ping 服务器)持开放态度。请注意,我确实希望能够为列传递数组参数,因此 [2,3,4] 或 [2] 或 [3,4],而不仅仅是单个或静态值。感谢您的帮助。

/**
 * extracts selected 'columns' (2nd dimension) from 2d array
 *
 * @arr {array} larger 2d array to be subset
 * @cols {array} subset of columns, eg, [3,4]
 * @return 2d array with only selected cols
 * @customfunction
 */
function getCols(arr,cols) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();  

  var arrRows = [];
  var arrCols = [];
  
  for(var r=0;r<arr.length;r++){
    arrCols = [];// reset snippet
  for(var c=0;c<cols.length;c++){
    arrCols.push([arr[r][cols[c]]]); // iterate to make 1xc array snippet
  }
    arrRows[r].push(arrCols); // iterate to add each row
  }
  
  return arrRows; // return new arr subset that only has requested cols
}

【问题讨论】:

  • 我必须为我糟糕的英语水平道歉。为了正确理解您的问题,您能否提供您期望的示例输入和输出值?
  • 我认为下面的 TheMaster 通过一些示例给出了一个很好的答案。它使用了与我习惯不同的方法,所以我仍在审查它。
  • 感谢您的回复。

标签: arrays google-apps-script subset extract slice


【解决方案1】:
function myfunc() {
  const ss=SpreadsheetApp.getActive();
  var vs=ss.getActiveSheet().getDataRange().getValues().map(function(r){return [r[2],r[3]];});
  ss.getActiveSheet().getRange(ss.getActiveSheet().getLastRow()+1,1,vs.length,vs[0].length).setValues(vs);
}

这将在当前数据的正下方输出列 C 和 D

【讨论】:

  • 谢谢。这确实适用于静态列,但我的意图是拥有可变数量的列。把所有的人都挤在一起也有点困难。您对可变列解决方案有什么想法吗?
【解决方案2】:

Array#filtermap 一起使用:

/**
 * extracts selected 'columns' (2nd dimension) from 2d array
 *
 * @param {Object[][]} arr larger 2d array to be subset
 * @param {Number[]} cols Indexes of subset of columns needed starting from 1 eg, [3,4]
 * @return {Object[][]} 2d array with only selected cols
 * @customfunction
 */
function getCols(arr,cols) {
  return arr.map(row =>
    row.filter((_,i) => cols.includes(++i)))
}
console.info(getCols([[1,2,3],[4,5,6]],[1,3]));
console.info(getCols([[1,2,3],[4,5,6]],[2,3]));

【讨论】:

  • 谢谢。我喜欢使用箭头功能。这是应用程序脚本,但我认为他们发布的新 v8 将运行这些脚本。我不确定 _ 是如何工作的。另外,如果我理解,这需要一个数组并拉出第 1 行和第 3 行。我打算获取列。我很欣赏这里发生的一切,但我不确定我是否得到了所有这些。你能帮我完成几个步骤吗?
  • @JasonTorpy 你练习过我提供的链接吗?这是第 1 步。它将在应用程序脚本 v8 中运行。 _ 什么都不是。您可以使用col 而不是_(但由于该变量无论如何都未使用,因此我使用了_)。它获取第 1 列和第 3 列,您可以通过运行 sn-p 看到。
  • 我很欣赏它的工作原理。它只使用了我从未使用过的函数,例如 map、filter、includes 和箭头函数。即使在函数之外运行东西也不是我做的事情。我是自学的,并且已经赚了很多钱,编码应用程序脚本和 VBA 和其他东西,但我是自学的,所以多年来我错过了一些简单的东西。我只是深入研究,但我必须弄清楚我在看什么才能用它来满足我的需要。谢谢你。
  • 我有你时的后续问题:为什么使用 console.info 而不是 Logger.log?有什么原因吗?
  • @JasonTorpy 这里的大多数人都是自学成才,包括我在内。我所要求的只是做你的功课。阅读链接并练习这部分编码。如果您不熟悉,请熟悉它。然后如果你不明白,问一个问题,我会解释。这样对我们俩来说都更容易。关于在函数外运行=>这里需要运行sn-p。在实际的编码场景中不需要它,其中函数是从带有参数的工作表中调用的。在这里,我从函数外部调用它:根据您的 jsdoc“模拟”一个 2D 数组和一个 1D 数字数组。
猜你喜欢
  • 1970-01-01
  • 2018-01-13
  • 2020-09-10
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 2018-03-12
相关资源
最近更新 更多