当前位置: 首页 > 知识库问答 >
问题:

Google脚本:如何将范围复制并粘贴到非空行上的新工作表

黄骏喆
2023-03-14

我试图复制并粘贴一个范围,从Sheet1 B4:E到一个新的目标范围,从Sheet2 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个答案

唐宏壮
2023-03-14

感谢@JPV的帮助,我对他们的脚本做了一个小小的改变,现在它工作得很好。

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

js prettyprint-override">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;

}
郭坚壁
2023-03-14

而不是使用。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;

}
 类似资料:
  • 这应该真的很简单,但我一直在拖网论坛和答案数小时来寻找答案,但没有运气,所以我(不情愿地)创造了一个我自己的问题。 我要做的只是简单地创建一个新工作簿,并将另一个工作簿的范围粘贴到该工作簿中。听起来很简单..? 我原来的工作簿,让我们叫Book1。我试图创建一个新的工作簿,Book2,我将把单元格A1:B10的值复制到其中。 以下是我代码的一个版本(从第一册打开开始): 这会给出一个“Range类

  • 我最近开始在GoogleSheets中做一些工作,以前我可以在Excel中编写函数,但我无法在GoogleSheets脚本中实现这一点。 我有两张床单 第1页。单元格A1-E5包含基于某些选择标准表2的值。登记表 我需要的是在执行脚本时(通过绘图和链接宏) 我需要它来复制A1:E1范围 进入第2页,转到A列的第一个空白单元格,然后粘贴值。 我正在使用下面的脚本,并且 目标范围的坐标超出工作表的尺寸

  • 我有一张谷歌表格,里面有多张不同的表格。每次我向第一张工作表的单元格(比如G2: I1000中的任何单元格)添加文本时,我都希望其他几个单元格的值出现在第二张工作表的下一个空行中。例如,如果我在第一张工作表上向I5添加文本,那么我希望自动将单元格A5: B5的值粘贴到第二张工作表(也在列A和B中)的下一个空行。

  • 我有以下脚本: 这是我找到脚本的原始帖子:https://support.google.com/docs/forum/AAAABuH1jm0hR40qh02UWE/?hl=en 我想对代码做一些小的调整,但不知道从哪里开始。 目前,当在G列中输入“Y”时,它复制整行,并将行内容放在ORDERS!的最后一行!。 我想让它做的是: 1) 仅复制订单最后一行上的B、C和E列!2) 在中删除E和F中的值!

  • 在一个编码的UI测试中,我试图使用range.copy从excel复制一个动态范围,并通过ctrl+V将其粘贴到wpf网格中。

  • > sheet1:用户单击运行VBA的按钮。 第2:VBA选择第D列上的第一个非空白单元格 Range(“d”&rows.count).end(xlUp).offsed(1).select 多谢!