使用Google脚本分享Google文档,以编辑方式设置一系列电子邮件(在Google表格中)

时间:2018-04-02 02:29:46

标签: google-apps-script google-sheets google-drive-api

我基本上想象的是可以改变允许编辑的工作表共享状态的命令。例如,我有一个公司的主文件(用于跟踪员工工作地点的“名册”以及他们在该区域工作的其他员工)以及员工用来跟踪进度的其他“区域表” 。人们每季度移动一次,所以我希望能够更新我的名册,然后让编程更新他们的工作表的共享状态,而不是点击每个工作表和复制粘贴的电子邮件。

据我所知,目前没有可能的方法来使用谷歌产品来实现这一目标。除了Google开发的新功能外,还有其他方法吗?

1 个答案:

答案 0 :(得分:-1)

我不认为我完全理解你的要求,所以我将开始重述我所理解的内容。

  1. 为每位员工生成一份他们在该季度工作的人员名单。
  2. 对于员工拥有的某组文件,请将这些文件编辑为员工当前的同事。
  3. 对于第1点,您已经在Google表格中构建了列表,因此您可以将内容读入数组进行处理。您可以使用Google Apps Script Spreadsheet Service。示例:

    var roster = SpreadsheetApp.getActive(); //assuming the script is running within the Roster spreadsheet
    var employeesSheet = roster.getSheetByName("Employees"); //assuming sheet name is "Employees"
    var employeeEmails = employeesSheet.getRange("B2:B").getValues(); //assuming the emails are in column B with the first row as header
    
    //In this next line I'm going to make a very big simplification.
    //I will assume that the coworkers emails are listed as "coworker1@company.com;coworker2@company.com" in the cell.
    //This is likely not the case, but you may already have this formatted in a way that works.
    //If not, you can merge these values in Google Apps Script, but I'll consider that outside the scope of this question.
    var coworkerEmails = employeesSheet.getRange("C2:C").getValues(); 
    

    对于第2点,我假设您已经有办法确定哪些文件需要修改其访问权限,并且您有权进行这些修改。您需要为此部分使用Drive Service。在我的示例中,我将假设所有相关文件都保存在特定于每个员工的文件夹中,并且文件夹ID保存在D列中。

    var folderIds = employeesSheet.getRange("D2:D").getValues();
    for (var i=0; i<employeeEmails.length; i++) {
      var folder = DriveApp.getFolderById(folderIds[i][0]);
      //At this point, you could give direct access to the entire folder,
      //or just to the files within the folder, as I will do.
      var files = folder.getFiles();
      while (files.hasNext()) {
        var file = files.next();
        file.addEditors(coworkerEmails[i][0].split(";"));
      }
    }
    

    请注意以上内容:

    • 这是未经测试的代码,仅用于演示如何实现您正在寻找的思考
    • 没有撤消访问权限。不过,这一点非常简单。
    • folder.getFiles()命令 获取文件夹子项的文件。因此,如果文件夹有子文件夹,您还需要遍历这些文件夹。
    • 您可能需要在名册电子表格中创建custom menu以运行此脚本

    最后,包括自定义菜单,您的代码可能会像:

    function onOpen() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var menuEntries = [];
      menuEntries.push({name: "Reset Permissions", functionName: "resetPermissions"});
      ss.addMenu("Roster Actions", menuEntries);
    }
    
    function resetPermissions() {
      var roster = SpreadsheetApp.getActive();
      var employeesSheet = roster.getSheetByName("Employees");
      var employeeEmails = employeesSheet.getRange("B2:B").getValues();
      var coworkerEmails = employeesSheet.getRange("C2:C").getValues(); 
      var folderIds = employeesSheet.getRange("D2:D").getValues();
      for (var i=0; i<employeeEmails.length; i++) {
        var folder = DriveApp.getFolderById(folderIds[i][0]);
        var files = folder.getFiles();
        while (files.hasNext()) {
          var file = files.next();
          file.addEditors(coworkerEmails[i][0].split(";"));
        }
      }
    }
    

    作为参考,这就是我假设“名册”电子表格中的示例“员工”表格看起来的方式:enter image description here