Google 脚本:如何将范围复制并粘贴到非空行上的新 sheet
Google Script: How to copy and paste range to a new sheet on a row that is not empty
我正在尝试将 Sheet1 B4:E 的范围复制并粘贴到新的目标范围, Sheet 2 B4:E 到 non 空行因为我也有一个Sheet2.
的 F 列中的公式
我目前的脚本只会粘贴到下一个可用的空行,但是由于 F 列中有一个公式,它会将源范围粘贴到 [=34= 的最底部]Sheet2。 (因为脚本将 F 中的公式视为非空行)
有没有办法复制一个范围并将其粘贴到另一个 sheet 上的特定范围,同时如果再次重新 运行 则不会覆盖任何数据?
我已经编写了 2 个脚本,如果我知道如何将它们 "merge" 放在一起就可以完成这项工作。
脚本 1: 将特定范围复制并粘贴到目标 sheet 的下一个空行,并且在脚本重新 [=65] 时不覆盖=].
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:将复制并粘贴到另一个 sheet 上的特定范围,但每次我重新 运行 脚本时都会覆盖。
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);
}
不要使用 .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 的帮助,我对他们的脚本做了一个小改动,现在效果很好。
下面是最终脚本 @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;
}
我正在尝试将 Sheet1 B4:E 的范围复制并粘贴到新的目标范围, Sheet 2 B4:E 到 non 空行因为我也有一个Sheet2.
的 F 列中的公式
我目前的脚本只会粘贴到下一个可用的空行,但是由于 F 列中有一个公式,它会将源范围粘贴到 [=34= 的最底部]Sheet2。 (因为脚本将 F 中的公式视为非空行)
有没有办法复制一个范围并将其粘贴到另一个 sheet 上的特定范围,同时如果再次重新 运行 则不会覆盖任何数据?
我已经编写了 2 个脚本,如果我知道如何将它们 "merge" 放在一起就可以完成这项工作。
脚本 1: 将特定范围复制并粘贴到目标 sheet 的下一个空行,并且在脚本重新 [=65] 时不覆盖=].
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:将复制并粘贴到另一个 sheet 上的特定范围,但每次我重新 运行 脚本时都会覆盖。
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);
}
不要使用 .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 的帮助,我对他们的脚本做了一个小改动,现在效果很好。
下面是最终脚本 @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;
}