Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 使用脚本复制google工作表,同时保留受保护工作表的权限_Google Apps Script_Google Sheets_Permissions_Duplicates_Protected - Fatal编程技术网

Google apps script 使用脚本复制google工作表,同时保留受保护工作表的权限

Google apps script 使用脚本复制google工作表,同时保留受保护工作表的权限,google-apps-script,google-sheets,permissions,duplicates,protected,Google Apps Script,Google Sheets,Permissions,Duplicates,Protected,我有一个脚本来复制源文件。在源文件中,有3个受保护的工作表(不受保护的范围),我已经在其中设置了权限。当我使用脚本时,它完美地复制了源文件。但是,复制文件中3个受保护工作表的权限已更改。与源文件中受保护工作表的原始权限不同,复制文件中的权限更改为,只有您可以编辑此范围。我可以知道我应该如何修改我的脚本,以便复制受保护工作表的权限吗?以下是我的脚本: function copyfilefromsource() { var ui = SpreadsheetApp.getUi(); var s

我有一个脚本来复制源文件。在源文件中,有3个受保护的工作表(不受保护的范围),我已经在其中设置了权限。当我使用脚本时,它完美地复制了源文件。但是,复制文件中3个受保护工作表的权限已更改。与源文件中受保护工作表的原始权限不同,复制文件中的权限更改为
,只有您可以编辑此范围。我可以知道我应该如何修改我的脚本,以便复制受保护工作表的权限吗?以下是我的脚本:

function copyfilefromsource() {
  var ui = SpreadsheetApp.getUi();
  var sheet_merge = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("List");
  var last_row = sheet_merge.getLastRow();
  var newsheet_firstname = null;
  var newsheet_surname = null;
  var newsheet_email = null;
  var source_folder = null;
  var file_owner = null;
  var dest_folder = null;
  var sheets_created = 0;
  var new_file = null;
  var source_file = null;
  var employee_id = null;
  var google_domain = null;
  var range = sheet_merge.getRange(1, 1, last_row, 4);
  var temp = null;
  source_file = DriveApp.getFileById(range.getCell(1, 2).getValue()); 
  dest_folder = DriveApp.getFolderById(range.getCell(2, 2).getValue()); 
    file_owner = range.getCell(3, 2).getValue();  
    google_domain = range.getCell(4, 2).getValue();   
  if (last_row <= 6) {
    SpreadsheetApp.getUi().alert("No rows to process!");
    return
  }
  for (var i = 7; i <= last_row; i++) { 
    if (range.getCell(i, 4).getValue() == '') {   
    employee_id = range.getCell(i, 1).getValue();       
    newsheet_email =  employee_id + google_domain;  
    newsheet_firstname = range.getCell(i, 2).getValue(); 
    newsheet_surname = range.getCell(i, 3).getValue();  
    new_file = source_file.makeCopy(employee_id, dest_folder);
    new_file.setOwner(file_owner);  
    new_file.addViewer(newsheet_email); 
    new_file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.EDIT);
    SpreadsheetApp.getActiveSheet().getRange(i,1).setFormula('=HYPERLINK("' + new_file.getUrl() +'/","'+employee_id+'")');
    SpreadsheetApp.getActiveSheet().getRange(i,4).setValue(new_file.getId());
    sheets_created++; 
    }
  }
  ui.alert(sheets_created + " files were created!")
}

function testFolder(folderName){
  var exist = true;
  try{var testFolder = DocsList.getFolder(folderName)}
  catch(err){exist=false}
  return exist;
}
函数copyfilefromsource(){
var ui=SpreadsheetApp.getUi();
var sheet_merge=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“列表”);
var last_row=sheet_merge.getLastRow();
var newsheet_firstname=null;
var newsheet_姓氏=null;
var newsheet_email=null;
var source_folder=null;
var file_owner=null;
var dest_folder=null;
已创建的风险值=0;
var new_file=null;
var source_file=null;
var employee_id=null;
var google_domain=null;
var range=sheet\u merge.getRange(1,1,最后一行,4);
var-temp=null;
source_file=DriveApp.getFileById(range.getCell(1,2.getValue());
dest_folder=DriveApp.getFolderById(range.getCell(2,2.getValue());
file_owner=range.getCell(3,2).getValue();
google_domain=range.getCell(4,2.getValue();

如果(最后一排)我相信你的目标如下

  • 你想复制谷歌电子表格
  • 复制Google电子表格时,您希望复制受保护的范围和工作表
问题和解决方法: 不幸的是,在当前阶段,当复制Google电子表格时,似乎没有复制受保护的范围。不幸的是,虽然可以复制受保护的工作表,但无法正确复制受保护工作表的条件。这种情况与手动复制和脚本复制相同。因此,在本例中,我n为了实现您的目标,需要在复制源电子表格后复制受保护的范围和工作表

在这个答案中,我建议使用Sheets API来实现您的目标。因为我认为使用Sheets API时,脚本可能会更简单

当您的脚本被修改时,它将变成如下所示

修改脚本: 请将以下函数添加到脚本中。和

并且,请按如下方式修改您的脚本

发件人: 致: 注:
  • 我不确定for循环中的电子表格副本数。因此,当处理时间超过Google Apps脚本的最大执行时间6分钟时,请通过修改脚本来减少处理数量。请注意这一点
参考资料:
  • 相关线程。
      • 此线程复制工作表中的受保护范围。为了复制受保护的工作表,需要删除目标工作表的保护并再次复制。因此我发布了此答案,但没有标记为重复

谢谢塔奈克,效果非常好!谢谢你的详细回答:)@weizer谢谢你的回复。我很高兴你的问题得到了解决。也谢谢你。
function copyProtectedRanges(srcId, dstId) {
  const dstSS = SpreadsheetApp.openById(dstId);
  dstSS.getProtections(SpreadsheetApp.ProtectionType.SHEET).forEach(s => s.remove());
  SpreadsheetApp.flush();
  const dstSheets = dstSS.getSheets().map(s => s.getSheetId());
  const requests = Sheets.Spreadsheets.get(srcId, {fields: "sheets/protectedRanges"}).sheets.reduce((ar, s, i) => {
    if (s.protectedRanges && s.protectedRanges.length > 0) {
      const temp = s.protectedRanges.map(e => {
        delete e.protectedRangeId;
        e.range.sheetId = dstSheets[i];
        return {addProtectedRange: {protectedRange: e}};
      });
      ar = ar.concat(temp);
    }
    return ar;
  }, []);
  Sheets.Spreadsheets.batchUpdate({requests: requests}, dstId);
}
new_file = source_file.makeCopy(employee_id, dest_folder);
new_file.setOwner(file_owner);
new_file.addViewer(newsheet_email);
new_file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.EDIT);
SpreadsheetApp.getActiveSheet().getRange(i, 1).setFormula('=HYPERLINK("' + new_file.getUrl() + '/","' + employee_id + '")');
var dstSS = new_file = source_file.makeCopy(employee_id, dest_folder); // Modified
new_file.setOwner(file_owner);
new_file.addViewer(newsheet_email);
new_file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.EDIT);

copyProtectedRanges(source_file.getId(), dstSS.getId()); // Added

SpreadsheetApp.getActiveSheet().getRange(i, 1).setFormula('=HYPERLINK("' + new_file.getUrl() + '/","' + employee_id + '")');