【问题标题】:Google Sheets Scripts - Copy whole sheet protection [closed]Google Sheets Scripts - 复制整个工作表保护[关闭]
【发布时间】:2021-05-26 16:35:05
【问题描述】:

我正在使用解决方案given here 在保持保护的同时复制工作表。我添加了名为 Sheets 的 Google Sheets API - V4。

但是,它会引发错误 -

GoogleJsonResponseException: API call to sheets.spreadsheets.batchUpdate failed with error: Invalid requests[0].addProtectedRange: The range you're trying to exclude must be within "A".

经过反复试验,我发现因为我的保护是除某些范围外的整张纸,因此会出错。当我只保护几个范围时,代码可以正常工作。

现在解决方案here 会复制具有整个工作表保护的工作表。但是,它适用于单张纸。我需要将这两者结合起来,但我很挣扎。

copyTo()和Sheets.Spreadsheets.get(id)返回的sheet对象不同,第二个没有protect()方法。所以我在这里没有具体的错误,但需要针对结合两种解决方案的解决方案。我需要复制多张工作表,同时保持整个工作表保护而没有一些范围。

【问题讨论】:

  • 天知道人们为什么投反对票。我在其他任何地方都没有找到类似的问题。答案中提到的是单张纸。

标签: google-apps-script google-sheets


【解决方案1】:

问题:

链接的代码与多个保护范围有关,而不是例外的工作表保护。如您所见,代码包含addProtectedRange,它与您现有的保护措施冲突,因为代码假定您拥有Range,但您拥有的Sheet 保护措施彼此不兼容。

改用此代码:

代码:

function duplicateSheetWithProtections() {
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 

  // Template sheet
  var sheet = ss.getSheetByName("Template");
  var p = sheet.getProtections(SpreadsheetApp.ProtectionType.SHEET)[0];

  // Output sheet, and protect the sheet by default
  var sheet2 = sheet.copyTo(ss).setName("Template Copy"); 
  var p2 = sheet2.protect();
  
  // Copy protection properties
  p2.setDescription(p.getDescription());
  p2.setWarningOnly(p.isWarningOnly());  

  if (!p.isWarningOnly()) {
    // Copy editors
    p2.removeEditors(p2.getEditors());
    p2.addEditors(p.getEditors());
    // Copy domain settings if using Apps domain
    // p2.setDomainEdit(p.canDomainEdit()); 
  }

  // Get all unprotected ranges on template
  var ranges = p.getUnprotectedRanges();
  var newRanges = [];
  for (var i = 0; i < ranges.length; i++) {
    newRanges.push(sheet2.getRange(ranges[i].getA1Notation()));
  } 

  // Unprotect them in output
  p2.setUnprotectedRanges(newRanges);
}  

输出:

编辑:

  • 如果您想从模板复制多张工作表,则只需通过添加参数/变量作为sheetName 来修改函数。代码应该是这样的:

function duplicateSheetWithProtections(sheetName) {

var sheet2 = sheet.copyTo(ss).setName(sheetName);

  • 然后在循环中调用函数。
function main() {
  var sheetNames = ["A", "B", "C"];
  sheetNames.forEach(function (sheetName){
    duplicateSheetWithProtections(sheetName);
  });
}

参考:

【讨论】:

  • 谢谢@NaziA。我偶然发现了相同的代码,并试图为批量工作表实现它。但是,我得到保护()不是一个函数。对此有什么想法吗?
  • 您打算复制多少张表@SurajS?你能显示你的代码尝试在上面做这个答案,以便我可以调试你的问题。
  • 我已经修改了上面的答案并添加了一个循环来创建批量复制的工作表。请检查@SurajS
  • 12 份。每个月一个,这需要做多次。我已经更新了问题。
  • 谢谢你,Nazia,如果你能发现我上面的代码有什么问题,我也会很高兴,因为它可以帮助我更好地理解脚本。
猜你喜欢
  • 2020-05-19
  • 1970-01-01
  • 2021-02-10
  • 2021-12-11
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
相关资源
最近更新 更多