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

批量分配Drive权限时遇报错:Drive.Permissions.create is not a function

解决Drive.Permissions.create is not a function报错问题

问题根源

你使用了**Google Drive高级服务(Drive Advanced Service)**的API语法,但未在脚本编辑器中启用该服务;或者混淆了基础DriveApp服务与高级Drive服务的调用逻辑,导致触发类型错误。

解决方案

方案1:启用Drive高级服务(适配原代码逻辑)

  1. 打开Google Apps Script编辑器,点击左侧菜单栏的「服务」
  2. 点击「添加服务」,找到「Drive API」并选中,点击「添加」
  3. 确认服务名称为Drive(默认名称),完成启用

启用后,原代码的Drive.Permissions.create语法即可生效,以下是优化后的代码:

//----- Gestion des éditeurs/commentateurs/lecteurs
function partagerFichiersEditeur() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("ClubUrls");
  const data = sheet.getDataRange().getValues();

  const dataToBeProcessed = data
    .filter((row, i) => i !== 0) // 跳过表头行
    .map(row => 
      row.map(cell => {
        try {
          // 从链接提取Drive文件ID
          const match = new RegExp("d/(.*)/", "gm").exec(cell);
          return match ? match[1] : cell;
        } catch {
          // 分割并清理邮箱地址
          return cell.trim().split(";").map(email => email.trim()).filter(email => email);
        }
      })
    );

  dataToBeProcessed.forEach(rowData => {
    const fileId = rowData[1];
    if (!fileId) return; // 跳过无文件ID的行

    try {
      // 分配编辑权限(第3列)
      rowData[2]?.forEach(destinataire => {
        Drive.Permissions.create(
          { role: "writer", type: "user", emailAddress: destinataire },
          fileId,
          { sendNotificationEmail: false }
        );
        console.log(`已共享编辑权限给 ${destinataire},文件ID: ${fileId}`);
      });

      // 分配编辑权限(第4列)
      rowData[3]?.forEach(destinataire => {
        Drive.Permissions.create(
          { role: "writer", type: "user", emailAddress: destinataire },
          fileId,
          { sendNotificationEmail: false }
        );
        console.log(`已共享编辑权限给 ${destinataire},文件ID: ${fileId}`);
      });

      // 分配阅读权限(第5列)
      rowData[4]?.forEach(destinataire => {
        Drive.Permissions.create(
          { role: "reader", type: "user", emailAddress: destinataire },
          fileId,
          { sendNotificationEmail: false }
        );
        console.log(`已共享阅读权限给 ${destinataire},文件ID: ${fileId}`);
      });

      // 分配阅读权限(第6列)
      rowData[5]?.forEach(destinataire => {
        Drive.Permissions.create(
          { role: "reader", type: "user", emailAddress: destinataire },
          fileId,
          { sendNotificationEmail: false }
        );
        console.log(`已共享阅读权限给 ${destinataire},文件ID: ${fileId}`);
      });

      // 如需启用评论者权限,取消注释下方代码
      /*
      // 分配评论权限(第8列)
      rowData[7]?.forEach(destinataire => {
        Drive.Permissions.create(
          { role: "commenter", type: "user", emailAddress: destinataire },
          fileId,
          { sendNotificationEmail: false }
        );
        console.log(`已共享评论权限给 ${destinataire},文件ID: ${fileId}`);
      });

      // 分配评论权限(第9列)
      rowData[8]?.forEach(destinataire => {
        Drive.Permissions.create(
          { role: "commenter", type: "user", emailAddress: destinataire },
          fileId,
          { sendNotificationEmail: false }
        );
        console.log(`已共享评论权限给 ${destinataire},文件ID: ${fileId}`);
      });
      */

    } catch (e) {
      console.error(`处理文件ID ${fileId} 时出错:`, e);
    }
  });
}

方案2:改用基础DriveApp服务(无需启用高级服务)

DriveApp的原生方法支持控制通知邮件,代码更简洁易维护:

//----- Gestion des éditeurs/commentateurs/lecteurs
function partagerFichiersEditeur() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("ClubUrls");
  const data = sheet.getDataRange().getValues();

  const dataToBeProcessed = data
    .filter((row, i) => i !== 0) // 跳过表头行
    .map(row => 
      row.map(cell => {
        try {
          // 从链接提取Drive文件ID
          const match = new RegExp("d/(.*)/", "gm").exec(cell);
          return match ? match[1] : cell;
        } catch {
          // 分割并清理邮箱地址
          return cell.trim().split(";").map(email => email.trim()).filter(email => email);
        }
      })
    );

  dataToBeProcessed.forEach(rowData => {
    const fileId = rowData[1];
    if (!fileId) return; // 跳过无文件ID的行

    try {
      const file = DriveApp.getFileById(fileId);

      // 分配编辑权限(第3列)
      rowData[2]?.forEach(destinataire => {
        file.addEditor(destinataire, { sendNotificationEmail: false });
        console.log(`已共享编辑权限给 ${destinataire},文件ID: ${fileId}`);
      });

      // 分配编辑权限(第4列)
      rowData[3]?.forEach(destinataire => {
        file.addEditor(destinataire, { sendNotificationEmail: false });
        console.log(`已共享编辑权限给 ${destinataire},文件ID: ${fileId}`);
      });

      // 分配阅读权限(第5列)
      rowData[4]?.forEach(destinataire => {
        file.addViewer(destinataire, { sendNotificationEmail: false });
        console.log(`已共享阅读权限给 ${destinataire},文件ID: ${fileId}`);
      });

      // 分配阅读权限(第6列)
      rowData[5]?.forEach(destinataire => {
        file.addViewer(destinataire, { sendNotificationEmail: false });
        console.log(`已共享阅读权限给 ${destinataire},文件ID: ${fileId}`);
      });

      // 如需启用评论者权限,取消注释下方代码
      /*
      // 分配评论权限(第8列)
      rowData[7]?.forEach(destinataire => {
        file.addCommenter(destinataire, { sendNotificationEmail: false });
        console.log(`已共享评论权限给 ${destinataire},文件ID: ${fileId}`);
      });

      // 分配评论权限(第9列)
      rowData[8]?.forEach(destinataire => {
        file.addCommenter(destinataire, { sendNotificationEmail: false });
        console.log(`已共享评论权限给 ${destinataire},文件ID: ${fileId}`);
      });
      */

    } catch (e) {
      console.error(`处理文件ID ${fileId} 时出错:`, e);
    }
  });
}

代码优化说明

  • 简化了原数据处理逻辑,用filter+map替代冗余操作
  • 增加可选链?.避免空值报错
  • 自动清理邮箱地址中的空格与空字符串,减少无效操作
  • 用console.error输出错误,便于调试定位

内容的提问来源于stack exchange,提问作者Nicolas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:04:51