Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数,用于移动用JavaScript编写的列,但在Google工作表中不起作用_Javascript_Google Apps Script_Google Sheets - Fatal编程技术网

函数,用于移动用JavaScript编写的列,但在Google工作表中不起作用

函数,用于移动用JavaScript编写的列,但在Google工作表中不起作用,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我有一个javascript函数,来自 我试着用我所掌握的稀疏知识将它转换成适合谷歌工作表的格式,但还没有成功 函数用于将数组中的列从列表中的索引中移位 我使用的是chrome V8 函数给出了一个错误,即无法读取未定义的属性长度 sht2.getRange1,1,result.length,结果[0]。length.setValuesresult 谢谢 这就是id所做的 Bob|Carol|Ted|Alice a |b |c |d 1 |2 |3 |4 A |B |

我有一个javascript函数,来自

我试着用我所掌握的稀疏知识将它转换成适合谷歌工作表的格式,但还没有成功

函数用于将数组中的列从列表中的索引中移位 我使用的是chrome V8

函数给出了一个错误,即无法读取未定义的属性长度 sht2.getRange1,1,result.length,结果[0]。length.setValuesresult

谢谢

这就是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

主要的问题是,您没有从“重新排列”返回任何内容。另一个问题是,您实际上并没有执行重新排列逻辑,而是将该函数保存到变量REQUATE中

不需要将逻辑保存在REQUATE函数内部的REQUATE变量中。你可以把那部分拿出来

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

*您还引用了倒数第二个映射中的数据,但这应该是如上所述的行。

主要问题是您没有从“重新排列”返回任何内容。另一个问题是,您实际上并没有执行重新排列逻辑,而是将该函数保存到变量REQUATE中

不需要将逻辑保存在REQUATE函数内部的REQUATE变量中。你可以把那部分拿出来

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

*您还引用了倒数第二张地图中的数据,但那应该是如上所示的行。

您没有回写电子表格抱歉,只是更新了函数Rebeat不返回任何内容您没有回写电子表格抱歉,只是更新了函数Rebeat不返回任何内容这是汗水!!非常感谢。迭戈,为什么用forEach而不是地图谢谢again@Einarr很高兴它起作用了。我建议你去问原作者,因为我根本没有检查任何一个。这是汗水!!非常感谢。迭戈,为什么用forEach而不是地图谢谢again@Einarr很高兴它起作用了。我建议你去问原作者,因为我根本没有检查过这些。
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])
  });
}