1

我有一个从这里得到的 javascript 函数

我试图用我所拥有的稀疏知识将它放入谷歌表格的正确格式,但还没有让它工作

该函数从我正在使用 chrome V8 的列表中的索引中移动数组中的列

该函数给出了Cannot read property length of undefined错误 sht2.getRange(1,1, result.length, result [0].length).setValues(result )

谢谢

这就是 id 的作用

Bob|Carol|Ted|Alice
a  |b    |c  |d
1  |2    |3  |4
A  |B    |C  |D 

如果索引列表是 ​​list=[3] 所以我得到

Alice|Bob|Carol|Ted
d    |a  |b    |c
4    |1  |2    |3
D    |A  |B    |C

列表 = [2,3]

Ted|Alice|Bob|Carol
c  |d    |a  |b
3  |4    |1  |2
C  |D    |A  |B
function test() {
  var ss   = SpreadsheetApp.getActiveSpreadsheet();  
  var sht  = ss.getSheetByName('users');
  var rng  = sht.getDataRange();
  var data = rng.getValues();
  
  var tofront = [2,0,28,4]
  var result = rearrange(data, [2,0,28,4])

  var sht2 = ss.getSheetByName('AAA');
  sht2.getRange(1,1, result.length, result [0].length).setValues(result );
}


function rearrange(rows, tofront) {
 var rearrange = (rows=[], toFront=[]) => {

  var originalHeaders = [...rows[0]]

  var remainingHeaders = [...rows[0]]

  var frontHeaders = toFront.map(index => {
    // set this one to null, to be filtered out later
    remainingHeaders[index] = null
    // grab the original header value
    return originalHeaders[index]
  })
  // you don't want to modify the original headers directly,
  // seeing as you might not end up with the desired result
  // if you pass a `toFront` value like [1,2] or where
  // any of the values come after another
  
  var newHeaders = [
    ...frontHeaders,
    ...remainingHeaders.filter(v => v !== null)
  ]
  
  return data.map(r => {
    let row = {}
    r.forEach((value, i) => {
      row[originalHeaders[i]] = value
    })
    
    return newHeaders.map(h => row[h])
  })
 }
}
4

1 回答 1

3

主要问题是您没有从rearrange(). 另一个问题是您实际上并没有执行重新排列逻辑,而实际上只是将该函数保存到变量rearrange中。

function rearrange(rows, tofront) {
 var rearrange = (rows=[], toFront=[]) => { /* rearranging logic */ }
 
 // Actually execute the logic and return its output
 return rearrange(rows, tofront);
}

无需将逻辑保存在函数rearrange内部的变量中rearrange()。你可以把那部分拿出来。

function test() {
  var ss   = SpreadsheetApp.getActiveSpreadsheet();  
  var sht  = ss.getSheetByName('users');
  var rng  = sht.getDataRange();
  var data = rng.getValues();
  
  var tofront = [2,3]
  var result = rearrange(data, tofront)

  var sht2 = ss.getSheetByName('AAA');
  sht2.getRange(1,1, result.length, result [0].length).setValues(result );
}


function rearrange(rows = [], toFront = []) {
  var originalHeaders = [...rows[0]]
  var remainingHeaders = [...rows[0]]

  var frontHeaders = toFront.map(index => {
    remainingHeaders[index] = null
    return originalHeaders[index]
  })
  
  var newHeaders = [
    ...frontHeaders,
    ...remainingHeaders.filter(v => v !== null)
  ]
  
  return rows.map(r => {
    let row = {}
    r.forEach((value, i) => {
      row[originalHeaders[i]] = value
    })
    
    return newHeaders.map(h => row[h])
  });
}

*您也在data倒数第二个中引用map(),但这应该rows如上所述。

于 2020-11-20T15:57:01.167 回答