【问题标题】:Google Script: How to copy and paste range to a new sheet on a row that is not emptyGoogle Script:如何将范围复制并粘贴到非空行的新工作表中
【发布时间】:2019-09-10 08:35:31
【问题描述】:

我正在尝试将 Sheet1 B4:E 的范围复制并粘贴到新的目标范围 Sheet 2 B4:E 空行,因为我在 Sheet2F 列中也有一个公式。
我目前拥有的脚本只会粘贴到下一个可用的空行,但由于列 F 中有一个公式,它会将源范围粘贴到 Sheet2的最底部>。 (因为脚本将 F 中的公式视为非空行)

有没有办法复制一个范围并将其粘贴到另一张纸上的特定范围内,同时在再次运行时不会覆盖任何数据?
如果我知道如何将它们“合并”在一起,我已经编写了 2 个脚本来完成这项工作。

脚本 1: 将特定范围复制并粘贴到目标工作表的下一个空行,并且在重新运行脚本时不会覆盖。

Script 1:

function transferArchive() { 
  
//TAB 1
//Target Range - Tab 1, Range 1
 var sss = SpreadsheetApp.getActiveSpreadsheet();
 var ss = sss.getSheetByName('Front Sheet'); 
  var range = ss.getRange('B4:E');
 var data = range.getValues();

//Destination Range - Tab 1, Range 1
 var tss = SpreadsheetApp.getActiveSpreadsheet();
 var ts = tss.getSheetByName('Printed POs');
 ts.getRange(ts.getLastRow()+1, 2, data.length, data[0].length).setValues(data);
  
  
}
 

脚本 2:将复制并粘贴到另一张纸上的特定范围,但每次我重新运行脚本时都会覆盖。

Script 2: 
function getdata() {
//Copies source range to specific target range, but overwrites, rather than copy down into a new row.  
  //
// Target range - Copy
      var sourcess = SpreadsheetApp.openById("1GDMpcONdRR56QbZkA17EcvetWggltAMhzeddhNEEUG0"); 
  var sourcesheet = sourcess.getSheetByName('Front Sheet');  
  var sourcerange = sourcesheet.getRange('B4:E');  
  var sourcevalues = sourcerange.getValues();
  
  // Destination range - Paste
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var destsheet = ss.getSheetByName('Printed POs');  
  var destrange = destsheet.getRange('B6:E'); 
  destrange.setValues(sourcevalues);  
  
}

【问题讨论】:

    标签: javascript google-sheets copy paste


    【解决方案1】:

    尝试调用计算列中最后一个单元格的函数,而不是使用 .getLastRow(),看看是否可行。示例:

    function transferArchive() {
    
    //TAB 1
    //Target Range - Tab 1, Range 1
    var sss = SpreadsheetApp.getActiveSpreadsheet();
    var ss = sss.getSheetByName('Front Sheet');
    var range = ss.getRange('B4:E');
    var data = range.getValues();
    
    //Destination Range - Tab 1, Range 1
    var tss = SpreadsheetApp.getActiveSpreadsheet();
    var ts = tss.getSheetByName('Printed POs');
    ts.getRange(lastRow(ts, 1), 2, data.length, data[0].length).setValues(data);
    }
    
    function lastRow(sheet, colNum) {
    var v = sheet.getRange(1, colNum, sheet.getLastRow()).getValues(),
        l = v.length,
        r;
    while (l > 0) {
        if (v[l] && v[l][0].toString().length > 0) {
            r = (l + 2);
            break;
        } else {
            l--;
        }
    }
    return r ? r : 1;
    
    }
    

    【讨论】:

    • 嗨@JPV,谢谢你看这个!我已经运行了您的脚本并出现以下错误消息:“找不到方法 getRange((class),number,number,number)”您有解决此错误消息的建议吗?再次感谢
    • 可能目标表仍然是空的。看看是否将最后一行更改为返回 r ? r:1;解决了(我更新了上面的代码)。
    • 嗨 JPV,只是为了让您知道,我还将 getActivesheet 更改为 openById 以及将 lastRow(ts 的值更改为 2 而不是 1。谢谢为您提供帮助
    【解决方案2】:

    感谢 @JPV 的帮助,我对他们的脚本做了一些小改动,现在效果很好。

    下面是 @JPV 帮助我回答这个问题的最终脚本:

    function transferArchive() {
    
    //TAB 1
    //Target Range - Tab 1, Range 1
    var sss = SpreadsheetApp.openById("1GDMpcONdRR56QbZkA17EcvetWggltAMhzeddhNEEUG0");
    var ss = sss.getSheetByName('Front Sheet');
    var range = ss.getRange('B4:E');
    var data = range.getValues();
    
    //Destination Range - Tab 1, Range 1
    var tss = SpreadsheetApp.openById("1GDMpcONdRR56QbZkA17EcvetWggltAMhzeddhNEEUG0")
    var ts = tss.getSheetByName('Printed POs');
    ts.getRange(lastRow(ts, 2), 2, data.length, data[0].length).setValues(data);
    }
    
    function lastRow(sheet, colNum) {
    var v = sheet.getRange(1, colNum, sheet.getLastRow()).getValues(),
        l = v.length,
        r;
    while (l > 0) {
        if (v[l] && v[l][0].toString().length > 0) {
            r = (l + 2);
            break;
        } else {
            l--;
        }
    }
    return r;
    
    }

    【讨论】:

      猜你喜欢
      • 2012-09-02
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2018-08-08
      相关资源
      最近更新 更多