在尝试制作一个脚本来在 Google Sheet 文件中制作工作表的副本时,我面临着我认为这是一个糟糕的范围定义问题。
除了一个“小”细节外,脚本运行良好。当脚本执行时,有两个(或更多)工作表。一张表是“导出数据库”,用于将导出结构化表复制并粘贴到外部数据库中。另一个工作表将是脚本的对象(执行按钮的活动工作表),它将被复制并重命名为 version_n。
问题是“DB Export”从中提取信息的活动工作表更改了其名称,因此应重命名导出中的公式。
除了“DB Export”中的原始标题消失的小细节之外,一切正常。
这里是代码:
function duplicateSheet() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var activeSheet = spreadsheet.getActiveSheet();
// Get the original sheet name
var originalSheetName = activeSheet.getName();
// Create a copy of the active sheet
var newSheet = activeSheet.copyTo(spreadsheet);
// Rename the old sheet with a version number
var sheets = spreadsheet.getSheets();
for (var i = 0; i < sheets.length; i++) {
if (sheets[i].getName() === originalSheetName) {
var versionNumber = sheets.length - 1; // Version number is the number of existing sheets
// Check if the original sheet name already contains a version number
if (/_v\d+$/.test(originalSheetName)) {
sheets[i].setName(originalSheetName.replace(/_v(\d+)$/, '_v' + versionNumber));
} else {
sheets[i].setName(originalSheetName + '_v' + versionNumber);
}
break;
}
}
// Rename the new sheet to the original sheet name
newSheet.setName(originalSheetName);
// Update the link in the "DB Export" sheet to the new sheet
var dbExportSheet = spreadsheet.getSheetByName('DB Export');
if (dbExportSheet) {
var formulas = dbExportSheet.getDataRange().getFormulas();
for (var i = 0; i < formulas.length; i++) {
for (var j = 0; j < formulas[i].length; j++) {
formulas[i][j] = formulas[i][j].replace(originalSheetName, newSheet.getName());
}
}
dbExportSheet.getRange(1, 1, formulas.length, formulas[0].length).setFormulas(formulas);
}
在代码的最后部分,我们定义了dbExportSheet DataRange()。我想问题就出在这里。 DataRange 正在获取工作表的所有行/列,而我希望它只修改除第 n°1 行之外的所有工作表。
应该很容易种马,但我错过了一些东西。
提前感谢您的反馈。
在你的展示脚本中,做如下修改怎么样?
// Update the link in the "DB Export" sheet to the new sheet
var dbExportSheet = spreadsheet.getSheetByName('DB Export');
if (dbExportSheet) {
var formulas = dbExportSheet.getDataRange().getFormulas();
for (var i = 0; i < formulas.length; i++) {
for (var j = 0; j < formulas[i].length; j++) {
formulas[i][j] = formulas[i][j].replace(originalSheetName, newSheet.getName());
}
}
dbExportSheet.getRange(1, 1, formulas.length, formulas[0].length).setFormulas(formulas);
}
// Update the link in the "DB Export" sheet to the new sheet
var dbExportSheet = spreadsheet.getSheetByName('DB Export');
if (dbExportSheet) {
var [, ...formulas] = dbExportSheet.getDataRange().getFormulas(); // Modified
for (var i = 0; i < formulas.length; i++) {
for (var j = 0; j < formulas[i].length; j++) {
formulas[i][j] = formulas[i][j].replace(originalSheetName, newSheet.getName());
}
}
dbExportSheet.getRange(2, 1, formulas.length, formulas[0].length).setFormulas(formulas); // Modified
}
DB Export
通过跳过第一行进行更新。