我有带有自定义附加组件的Google电子表格模板,我正在尝试复制
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();
}
问题是复制的电子表格已断开附加组件(在附加组件菜单中不显示)。脚本编辑器中有正确的附加代码,但是当我尝试运行任何功能时,我会收到错误消息
"We're sorry, a server error occurred. Please wait a bit and try again"
请记住,同一代码在我的模板电子表格中效果很好。即使我删除了所有代码并留下空的启用函数,错误仍然会出现。
当我使用常规Google Drive网站(drive.google.com)进行时,复制附加组件运行良好,并且当我尝试使用Google的API Explorer(https://developers.google.com/drive/v3)/参考/文件/复制#try-it)。问题似乎只有在使用SDK时(至少Java One-我还没有尝试过)
还要记住,我正在使用本文所述创建的Google服务帐户https://developers.google.com/indesity/protocols/oauth2serviceaccount#creatinginginganaccount
并使用以下代码创建驱动器实例
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
我找到了一个可接受的解决方案,我在那里描述了该解决方案如何使用API包含的GS脚本创建电子表格?
希望它对某人有帮助;)
在评论中如何创建用API的gs脚本创建电子表格?,这是用于制作认证帖子的应用程序脚本解决方案:
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脚本作为Certien用户执行,我下载了一个带有项目控制台的键 -> CREATE CREATE凭据 ->获取键并下载文件
def get_service(): 全局http_auth 全局委托书
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')
Admin_email是实际的管理电子邮件地址,Curr_dir和JSON_FILENAME与下载的文件有关,在您的情况下,我猜您不需要管理权,只需从当前项目的控制台下载JSON文件并使用您的电子邮件地址即可。使用Discovery API时,我的工作起作用,但是常规帖子应该更快一些地制作