在Google Apps脚本中的makeCopy()中找不到具有给定ID的项目

问题描述 投票:0回答:1

我有一个附加组件,允许用户将我的模板从我的驱动器下载到他们的驱动器,前提是附加组件已安装在他们的工作表或文档中。

应该复制的功能如下

function createFileCopy(id){
  var file = id.split('.');
  var docName = DriveApp.getFilesByName(file[0]);
  while (docName.hasNext()) {
    var file = docName.next();
    var fileId = file.getId();
    var fileName = file.getName();
  }

  Logger.log(fileId);
  var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(TEMPLATES_DATA);
  var data = sheet.getRange(1, 9, sheet.getLastRow()-1, 1).getValues();
  var pos = data.map(function (obj) { return obj[0]; }).indexOf(id);
  if(pos > -1){
//    var val = sheet.getRange("J" + (pos + 1)).getValue() + 1;
    var title = sheet.getRange("A" + (pos + 1)).getValue();
//    sheet.getRange("J" + (pos + 1)).setValue(val);
  }
  var newFile = DriveApp.getFileById(fileId).makeCopy('Copy of '+ title);
  return {
    title: newFile.getName(),
    url: newFile.getUrl()
  }

问题是,当用户试图制作副本时,他/她会收到错误“找不到具有给定ID的项目,或者您无权访问它”。

我评论了2行,我认为问题是由于将下载增量发回到原始电子表格,但事实证明这不是唯一的问题。

它在原始帐户BTW内正常工作。

我已向Add-on Advisor寻求帮助,但在此处进行了重新调整。

请帮忙

google-apps-script google-sheets google-drive-sdk
1个回答
1
投票

当用户安装附加组件时,它将在该用户的帐户下执行。因此,除非获得许可,否则他们无法访问您的模板电子表格。

如果您愿意与最终用户共享文件,则可以使用Advanced Service以编程方式授予/撤消模板的权限。这些高级服务仅仅是其相应API的包装器,因此在这种情况下,您需要利用Drive API V2文档来确定如何添加/删除权限。以下指南和参考应该有所帮助:

如果不希望共享文件,您可以选择使用服务帐户。服务帐户是您可以从GCP API控制台创建的一种特殊帐户。您可以授予服务帐户对模板的访问权限,然后使用服务帐户使用电子表格API将电子表格模板检索为Spreadsheet resource object in JSON format。然后,您可以使用此资源对象创建电子表格的用户拥有副本,而无需明确共享您的模板。 You can find more info on service accounts by checking other threads here on stackoverflow

© www.soinside.com 2019 - 2024. All rights reserved.