Google脚本:如何将范围复制并粘贴到不为空的行中的新表中

时间:2019-09-10 08:35:31

标签: javascript google-sheets copy paste

我正在尝试将范围从 Sheet1 B4:E 复制并粘贴到新的目标范围 Sheet 2 B4:E 移至空行,因为我在 Sheet2 F 列中也有一个公式。
我目前拥有的脚本只会粘贴到下一个可用的空行,但是由于 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);  
  
}

2 个答案:

答案 0 :(得分:0)

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

NavHost

答案 1 :(得分:0)

借助 @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;

}