将 map() 限制为仅 运行 在由范围组成的数组中的 headers 列表中

Restrict map() to only run on a list of headers in an array made from a range

我想将地图限制为仅包含列表 headers 中范围内的那些列,列表 headersv[0] 的子集,以便仅列出范围内列中的值headers 中的内容已更改。

function test() {
  var ss  = SpreadsheetApp.getActiveSpreadsheet();  
  var sht = ss.getSheetByName('Elements');  
  var rng = sht.getDataRange();
  var v   = rng.getValues();
  
  var headers = ['Id', 'Label'];
  //headers is a subset of v[0]
  

  //This will work for `all` values of the values
  //values = v.map(x => x.map(y => y==("Networking - 1") ? 1: y));

  values = v.map(x => x.map(y => y== cols.includes(y)==true && y=="Networking - 1" ? 1: y))
  
  var sht2 = ss.getSheetByName('AAA');
  sht2.getRange(1,1, v.length, v[0].length).setValues(v);
}

解释:

  • 第一步是获取headers出现的列索引。为此,您可以将 indexOf 应用于数据 v 的第一行,即 headers 行:

    v[0].indexOf(headers[0])
    v[0].indexOf(headers[1])
    
  • 下一步是使用 map 只获取这些列:

    v.map(d=>[d[v[0].indexOf(headers[0])],d[v[0].indexOf(headers[1])]]);
    

解决方案:

function test() {
  var ss  = SpreadsheetApp.getActiveSpreadsheet();  
  var sht = ss.getSheetByName('Elements');  
  var rng = sht.getDataRange();
  var v   = rng.getValues();
  
  
  var headers = ['Id', 'Label'];
  //headers is a subset of v[0]
  
  v = v.map(d=>[d[v[0].indexOf(headers[0])],d[v[0].indexOf(headers[1])]]); // new code

  //This will work for `all` values of the values
  //values = v.map(x => x.map(y => y==("Networking - 1") ? 1: y));

  values = v.map(x => x.map(y => y== cols.includes(y)==true && y=="Networking - 1" ? 1: y))
  
  var sht2 = ss.getSheetByName('AAA');
  sht2.getRange(1,1, v.length, v[0].length).setValues(v);
}