You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Google Apps Script批量修改表格中Google Docs的共享设置?

问题描述
  • 我有一张汇总Google Form提交文档的表格,这些文档仅与表单所有者共享,提交者无法访问。
  • 我需要自动修改文档共享设置,让提交者可查看,但不能让其他人访问(因存在Looker仪表盘,用户可搜索文档但不应打开他人的)。因此不能修改文档所在文件夹的共享设置,必须基于表格中的Google Doc ID和对应邮箱单独设置权限。
  • 我用=REGEXEXTRACT提取了文档ID,表格包含三列:File(Google Doc ID)、Email(共享对象邮箱)、URL(表单填写的原始链接)。
  • 我编写了一段Google Apps Script,但脚本仅反复共享第一行的文档ID,现需排查代码问题。
原代码片段
function shareFile() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sharing Update');
  const fileId = sheet.getRange(2,1).getValue();
  const email = sheet.getRange(2,2, sheet.getLastRow()-1,2).getValues();
  const fileToShare = DriveApp.getFileById(fileId);

email.forEach(function(email) {
  if(email[1] != (null))
   fileToShare.addEditor(email[0]);
   }
)}
问题分析与修复方案

核心问题

  1. 仅读取单个文件ID:sheet.getRange(2,1).getValue()只获取了第二行第一列的文件ID,没有遍历表格中所有行的文件ID。
  2. 数据范围错误:sheet.getRange(2,2, sheet.getLastRow()-1,2)读取的是从第二行第二列开始的2列数据,但实际需要的是每行对应的文件ID和邮箱,应该读取前两列的全部数据行。
  3. 条件判断不严谨:email[1] != (null)的逻辑错误,空单元格在Google Sheets中返回空字符串而非null,且索引对应关系混乱。
  4. 权限类型不符合需求:使用addEditor会赋予编辑权限,而需求是让提交者仅能查看,应使用addViewer。

修复后的代码

function shareFiles() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sharing Update');
  // 获取第二行开始的所有数据行(前两列:File ID和Email)
  const data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 2).getValues();
  
  // 逐行处理每个文件和对应邮箱
  data.forEach(row => {
    const fileId = row[0];
    const email = row[1];
    
    // 跳过空的File ID或Email
    if (fileId && email) {
      try {
        const file = DriveApp.getFileById(fileId);
        // 添加仅查看权限
        file.addViewer(email);
        
        // 清理多余权限:仅保留所有者和当前提交者
        const editors = file.getEditors();
        editors.forEach(editor => {
          const editorEmail = editor.getEmail();
          if (editorEmail !== email && editorEmail !== Session.getActiveUser().getEmail()) {
            file.removeEditor(editor);
          }
        });
        
        const viewers = file.getViewers();
        viewers.forEach(viewer => {
          const viewerEmail = viewer.getEmail();
          if (viewerEmail !== email && viewerEmail !== Session.getActiveUser().getEmail()) {
            file.removeViewer(viewer);
          }
        });
      } catch (e) {
        console.log(`处理文件ID ${fileId} 时出错:${e.message}`);
      }
    }
  });
}

修复说明

  • 遍历所有数据行:通过getRange(2,1, sheet.getLastRow()-1,2).getValues()获取全部待处理的文件ID和邮箱对,逐行处理。
  • 调整权限类型:用addViewer替代addEditor,满足仅查看的需求。
  • 清理多余权限:移除文档中除所有者和当前提交者外的其他编辑/查看权限,确保数据隔离。
  • 错误处理:加入try-catch块捕获异常,避免单个文件处理失败导致整个脚本中断。

内容的提问来源于stack exchange,提问作者Ryan Tanner-Read

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:27:45