javascript - 用于将行从一张纸移动到另一张纸的 Google 脚本的实现

标签 javascript google-apps-script google-sheets

我正在尝试编写一个脚本,将标记为“已记录”的行从一个谷歌电子表格移动到另一个谷歌电子表格。我的脚本主要是基于这个脚本[link] 。但是,执行脚本时,它不会将所有记录的行从源电子表格移动到目标电子表格。我检查了 dest 数组的值(dest.length 和 dest[0].length)。但除了没有捕获所有目标行并且没有删除所有选定行之外,我找不到任何错误。我对 JavaScript 不熟悉。如果有人能指出我正确的方向,那就太好了。另外,我不知道这是否重要,但源电子表格仍然使用旧版本,而目标电子表格使用较新版本。

  var s = SpreadsheetApp.openByUrl('Link1'); \\Source spreadsheet
  var ss = s.getSheetByName('Sheet28'); 
  var t = SpreadsheetApp.openByUrl('Link2'); \\target spreadsheet
  var ts = t.getSheetByName('Sheet11');
  var data = ss.getRange(1,1, ss.getLastRow(),ss.getLastColumn()).getValues(); 
  var dest = [];
  Logger.log(data.length)
  for (var i = 1; i < data.length; i++ ){
    if ( data[i][22] == 'recorded' && data[i][22] !="") {
         dest.push(data[i]); 
       \\appending the array
         ss.deleteRow(i);
        \\delete the row
        }}
 Logger.log(dest.length);
 if (dest.length > 0  && dest[0].length >0}{
   ts.getRange(ts.getLastRow()+1,1,dest.length,dest[0].length).setValues(dest);         
 }`

最佳答案

快速浏览了一下。我认为您的代码不起作用,因为当您删除一行时,它会改变工作表结构,因此下一次删除将是错误的。

示例。您在电子表格的第 4 行中找到了匹配项。然后在工作表中删除第 4 行。所以第 5 行现在变成第 4 行 i 增加 1,因此现在它位于 data 数组的第 5 行。如果找到匹配项,则会删除工作表中的第 5 行,而实际上应该删除第 4 行。

我能想到解决这个问题的唯一方法就是先进行匹配,然后再删除,就像这样。

 for (var i = 0; i < data.length; i++ ){
    if ( data[i][0] == 'recorded') {
           dest.push(data[i]); 


        }}

  for (var x = 0; x < data.length; x++ ){
    if ( data[x][0] == 'recorded') {
      ss.deleteRow(x+1)  ;    

        }}

也许这可以作为一种解决方案,但尚未经过测试。

function moveData(){

 var s = SpreadsheetApp.openByUrl('Link1'); 
  var ss = s.getSheetByName('Sheet28'); 
  var t = SpreadsheetApp.openByUrl('Link2'); 
  var ts = t.getSheetByName('Sheet11');
  var data = ss.getDataRange().getValues();
  var dest = [];

   for (var i = 0; i < data.length; i++ ){
    if ( data[i][22] == 'recorded') {

         dest.push(data[i]); 


        }}

  for (var x = 0; x < data.length; x++ ){
    if ( data[x][22] == 'recorded') {
      ss.deleteRow(x+1)  ;    

        }}

 if (dest.length > 0  && dest[0].length >0){
   ts.getRange(ts.getLastRow()+1,1,dest.length,dest[0].length).setValues(dest);         
 }
}

编辑

也许是经过深思熟虑才能解决这个问题。如果该行匹配,则从 data 数组和电子表格中删除该条目。

然后 i var 可以与行号保持同步。

沿着这些思路,再次未经测试

for (var i = 0; i < data.length; i++ ){
    if ( data[i][22] == 'recorded') {

         dest.push(data[i]); 

         ss.deleteRow(i+1) ;
         delete data[i];
      i= i -1 ;
        }
   }

希望这有帮助

关于javascript - 用于将行从一张纸移动到另一张纸的 Google 脚本的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28390564/

相关文章:

javascript - 使用纬度/经度输入拖动点

google-apps-script - 设置 Google Sheets 文件中每个图表的高度和宽度

javascript - 有没有办法在不取消运行的情况下查看谷歌应用程序脚本中的记录器?

google-sheets - 在 Google 表格中重复每行 N 次

javascript - D3 : zoom to bounding box with d3-tiles

javascript - 如何将函数与 chai.should 匹配

Javascript/Node.js "Function name"不是一个函数

date - 如何在 Google Apps Scripts 中创建具有特定时区的 Date()

mobile - 让 Google Apps 脚本在移动设备上运行

google-apps-script - 打开单元格以在 Google 表格中进行编辑