You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Google Apps Script复制表格时出现Exception: Service error: Drive错误的解决方法

Google Apps Script复制表格时出现Exception: Service error: Drive错误的解决方法

嗨,我看到你之前正常运行的表格复制脚本现在抛出了Exception: Service error: Drive.错误,别担心,咱们一步步来排查和解决这个问题。

首先,排查最常见的权限问题

这个错误大概率和权限相关,毕竟几个月前还能用,很可能是权限范围或者文件/文件夹的权限发生了变动:

  • 重新授权脚本:打开你的脚本编辑器,点击顶部的「运行」按钮,会弹出权限授权窗口,重新授予脚本访问Drive和Spreadsheet的全部权限(这是Google Apps Script的常规操作,不用担心安全问题)。
  • 检查文件与文件夹权限:确认你当前运行脚本的账号,对原表格(SpreadsheetApp.getActiveSpreadsheet()对应的文件)以及它所在的父文件夹,拥有编辑权限。如果文件夹是共享文件夹或者团队盘,检查是否权限被管理员收回了。

然后,优化代码里的潜在问题

你的代码逻辑是对的,但有些细节可以调整得更健壮,避免触发Drive服务的异常:

  1. 用文件ID代替URL打开表格openByUrl有时候会因为URL格式或者缓存问题出故障,换成openById更可靠。
  2. 避免依赖全局变量:把需要的参数直接传递给函数,减少环境变量带来的意外。
  3. 更稳妥地获取父文件夹getParents().next()在文件有多个父文件夹或者没有父文件夹时会报错,最好直接指定父文件夹ID(你可以在Drive里打开文件夹,从URL里提取ID)。

下面是调整后的完整代码:

var outlet = [
["p1", "place1", "great place 1"], 
["p2", "place2", "great place 2"],
];

function looping() {
    for (var i = 0; i < outlet.length; i++) {
      duplicate(outlet[i][2], outlet[i]); // 直接传递当前outlet项
      Logger.log(outlet[i][1]);
    }
}

function duplicate(nama, outletItem) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ssid = ss.getId();
  const ssdrive = DriveApp.getFileById(ssid);
  
  // 推荐:直接用父文件夹ID,比getParents().next()更稳妥
  // 替换成你的父文件夹ID,从Drive文件夹URL里提取
  const parentFolderId = "你的父文件夹ID";
  const parent = DriveApp.getFolderById(parentFolderId);

  const newss = ssdrive.makeCopy(nama, parent);
  // 检查副本是否创建成功
  if (!newss) {
    Logger.log(`创建副本${nama}失败`);
    return;
  }

  modify(newss.getId(), outletItem); // 传递副本ID和outlet项
}

function modify(ssId, outletItem) {
  const ssopen = SpreadsheetApp.openById(ssId);
  const range1 = ssopen.getRange("A1");
  const range2 = ssopen.getRange("A2");
  const toko = ssopen.getDataRange();
  const real = outletItem[1].replace("SPOKE SMG ","").replace(" ","")

  range1.setValue(outletItem[0]);
  range2.setValue(outletItem[1]);
  ssopen.setNamedRange(real, toko);
  Logger.log(outletItem[0]);
}

最后,测试运行

修改完代码后,先运行looping函数,看看是否还会抛出错误。如果还是有问题,可以查看脚本的「执行记录」(脚本编辑器左侧菜单→执行),里面会有更详细的错误信息,能帮我们进一步定位问题。

备注:内容来源于stack exchange,提问作者Trem Trem

火山引擎 最新活动