首页 > 解决方案 > 将 map() 限制为仅在由范围组成的数组中的标头列表上运行

问题描述

我想将映射限制为列表中的那些列,这些列是列表headers的子集,以便仅更改v[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);
}

标签: javascriptgoogle-apps-scriptgoogle-sheetsmap-function

解决方案


解释:

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

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

推荐阅读