如何用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]); } )}
问题分析与修复方案
核心问题
- 仅读取单个文件ID:
sheet.getRange(2,1).getValue()只获取了第二行第一列的文件ID,没有遍历表格中所有行的文件ID。 - 数据范围错误:
sheet.getRange(2,2, sheet.getLastRow()-1,2)读取的是从第二行第二列开始的2列数据,但实际需要的是每行对应的文件ID和邮箱,应该读取前两列的全部数据行。 - 条件判断不严谨:
email[1] != (null)的逻辑错误,空单元格在Google Sheets中返回空字符串而非null,且索引对应关系混乱。 - 权限类型不符合需求:使用
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
相关产品推荐
相关产品推荐

