首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用google java客户端复制电子表格后,自定义google应用程序脚本不起作用

使用google java客户端复制电子表格后,自定义google应用程序脚本不起作用
EN

Stack Overflow用户
提问于 2016-06-22 19:45:23
回答 2查看 1.1K关注 0票数 5

我有谷歌电子表格模板与自定义插件,我试图复制

代码语言:javascript
复制
def copyTemplateSpreadsheet(Drive driveService) {
    File templateCopy = new File()
    templateCopy.setName("excel-template")

    def copiedFile = driveService.files().copy(templateSpreadsheetId, templateCopy).execute()
    setCorrectPermission(driveService, copiedFile.getId())
    copiedFile
}

private void setCorrectPermission(Drive driveService, def fileId) {
    Permission newPermission = new Permission();
    newPermission.setType("anyone");
    newPermission.setRole("writer");
    driveService.permissions().create(fileId, newPermission).execute();
}

问题是复制的电子表格损坏了附加组件(不显示在附加组件菜单中)。脚本编辑器中有正确的附加代码,但当我尝试运行任何函数时,我收到错误信息

代码语言:javascript
复制
"We're sorry, a server error occurred. Please wait a bit and try again"

请记住,完全相同的代码在我的模板电子表格中工作得很好。即使我删除所有代码并保留空的onOpen函数,错误仍然会出现。

当我使用常规的google drive网站(drive.google.com)复制附加组件时效果很好,当我尝试使用谷歌的API Explorer (https://developers.google.com/drive/v3/reference/files/copy#try-it)时也是如此。这个问题似乎只有在使用sdk时才会出现(至少是java的sdk--我没有尝试过其他的sdk)。

还要记住,我使用的是本文https://developers.google.com/identity/protocols/OAuth2ServiceAccount#creatinganaccount中描述的谷歌服务帐户

并使用以下代码创建驱动器实例

代码语言:javascript
复制
 Drive getDriveService() throws GeneralSecurityException, IOException, URISyntaxException {
    HttpTransport httpTransport = new NetHttpTransport();
    JacksonFactory jsonFactory = new JacksonFactory();
    GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(jsonFactory)
            .setServiceAccountId(G_SERVICE_EMAIL)
            .setServiceAccountScopes(Arrays.asList(DriveScopes.DRIVE))
            .setServiceAccountPrivateKeyFromP12File(PKC_12_FILE)
            .build();
    Drive service = new Drive.Builder(httpTransport, jsonFactory, null)
            .setHttpRequestInitializer(credential)
            .build();


    return service;
}

我不确定这是否重要,特别是其他一切似乎都很好的情况下

有什么好的主意吗?我对任何变通方法都持开放态度,只要它们起作用。此外,我可以创建新的文件和添加附加代码,但似乎我不能用API做这些

EN

回答 2

Stack Overflow用户

发布于 2016-07-06 14:29:14

我已经找到了一个可接受的解决方案,我在那里描述了How can I create spreadsheet with included gs script by API?

希望它能帮助某些人;)

票数 1
EN

Stack Overflow用户

发布于 2016-07-01 20:26:44

How can I create spreadsheet with included gs script by API?中的评论之后,这是用于制作身份验证帖子的应用脚本解决方案:

代码语言:javascript
复制
function sendToHR(url,data){
  var forDriveScope = DriveApp.getStorageUsed(); //needed to get Drive Scope requested
  var dataToSend = [getName(),getID()];
  for(key in data){
    dataToSend.push(data[key])
  }
  var paylod = {
    "data" : dataToSend
  };
  paylod = JSON.stringify(paylod);
  var param = {
       "method":"POST",

       "headers"     : {"Accept":"application/json","Authorization": "Bearer " + ScriptApp.getOAuthToken()}, 
       "payload": paylod
      };
  return UrlFetchApp.fetch(url,param).getContentText();
}

我有一个python示例,它可能对您更有用,为了让python脚本以认证用户的身份执行,我从项目控制台-> create credential -> get Key下载了一个带有密钥的JSON文件,并下载了该文件。

def get_service():全局http_auth全局delegated_credentials

代码语言:javascript
复制
scopes = ['https://www.googleapis.com/auth/userinfo.email']
keyfile = os.path.join(CURR_DIR, JSON_FILENAME)
credentials = ServiceAccountCredentials.from_json_keyfile_name(
keyfile, scopes=scopes)
delegated_credentials = credentials.create_delegated(ADMIN_EMAIL)
http_auth = delegated_credentials.authorize(Http())
return build('SERVICE', 'v1', http=http_auth,
            discoveryServiceUrl='DISCOVERY API SERVICE')

JSON是实际的管理员电子邮件地址,CURR_DIR和JSON_FILENAME与您下载的文件相关,我猜您不需要管理员权限,只需从当前项目的控制台下载ADMIN_EMAIL文件并使用您的电子邮件地址即可。我的在使用发现API时可以工作,但是一个常规的POST应该会更快一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37967100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档