如何通过DocuSign API实现Google Drive自动认证(GAS场景)
解决DocuSign访问Google Drive PDF的未认证问题
是的,你完全可以借助Google API的刷新令牌实现自动认证,让DocuSign能够安全访问你的Google Drive私有PDF文件,无需手动登录Google账号。下面是具体的解决方案和代码修改步骤:
问题根源
你遇到的EXTERNAL_DOC_SERVICE_ERROR错误,本质是DocuSign尝试访问Google Drive的PDF文件时,该文件处于私有状态,且没有提供有效的Google认证凭据,导致Google拒绝了未登录的访问请求。直接将文件设为公开共享存在安全风险,而使用OAuth2的刷新令牌可以让DocuSign通过临时访问令牌安全访问私有文件。
实现步骤
1. 准备Google OAuth2凭据
- 前往Google Cloud Console,创建或选择你的项目,启用Google Drive API
- 创建一个OAuth客户端ID,应用类型选择「桌面应用」(适合脚本类应用场景)
- 通过OAuth授权流程获取刷新令牌和初始访问令牌(可以用Google Apps Script的OAuth2库简化这个过程,也可以手动通过授权码交换)
2. 修改Google Apps Script代码
我们需要在脚本中添加OAuth2认证逻辑,获取短期访问令牌,然后构造带有访问令牌的Google Drive文件下载URL,传给DocuSign的remoteUrl参数。
完整修改后的代码
// 先添加OAuth2库:脚本编辑器→资源→库,输入ID:1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF,选最新版本 var OAUTH2_LIB_ID = "1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF"; function getGoogleAccessToken() { // 建议把这些敏感信息存在脚本属性里(文件→项目属性→脚本属性),不要硬编码 const clientId = "YOUR_GOOGLE_CLIENT_ID"; const clientSecret = "YOUR_GOOGLE_CLIENT_SECRET"; const refreshToken = "YOUR_GOOGLE_REFRESH_TOKEN"; // 初始化OAuth2服务,获取访问令牌 const service = OAuth2.createService("DriveAccess") .setTokenUrl("https://oauth2.googleapis.com/token") .setClientId(clientId) .setClientSecret(clientSecret) .setRefreshToken(refreshToken); if (service.hasAccess()) { return service.getAccessToken(); } else { throw new Error("获取Google访问令牌失败: " + service.getLastError()); } } function Docusign() { var ss = SpreadsheetApp.openById('MYSPREADSHEETID'); var sheet = ss.getSheetByName("SHEET"); var quotesheet = ss.getSheetByName("SHEET2"); var Avals = sheet.getRange("A1:A").getValues(); var Alast = Avals.filter(String).length; var basicinfo = sheet.getRange(Alast, 1, 1, 35).getValues()[0]; var quotelinks = quotesheet.getRange(Alast, 1, 1, 10).getValues()[0]; var name = basicinfo[2]; var email = basicinfo[1]; // 从Drive链接中提取文件ID const docUrl = quotelinks[0]; const fileId = docUrl.match(/[-\w]{25,}/)[0]; // 正则匹配Drive文件ID // 获取Google Drive访问令牌 const accessToken = getGoogleAccessToken(); // 构造带访问令牌的私有文件下载URL,DocuSign可通过这个URL认证访问 const remoteUrl = `https://www.googleapis.com/drive/v3/files/${fileId}?alt=media&access_token=${accessToken}`; var url = "https://demo.docusign.net/restApi/v2/accounts/MYACCOUNTID/envelopes"; var payload = { "documents": [ { "documentId": "1", "fileExtension": "pdf", "name": "NAMEOFDOC", "remoteUrl": remoteUrl } ], "emailSubject": "SUBJECT", "recipients": { "signers": [ { "email": email, "name": name, "recipientId": "1", "tabs": { "signHereTabs": [ { "documentId": "1", "pageNumber": "1", "tabLabel": "Signature", "xPosition": "140", "yPosition": "650" } ], "dateTabs": [ { "documentId": "1", "pageNumber": "1", "tabLabel": "date", "xPosition": "420", "yPosition": "680" } ] } } ] }, "status": "sent" }; var options = { "contentType": "application/json", "method" : "post", "headers": { "X-DocuSign-Authentication": "{\"Username\":\"MYUSERNAME\",\"Password\":\"MYPASSWORD\",\"IntegratorKey\":\"MYINTEGRATORKEY\"}", }, "payload" : JSON.stringify(payload) }; try { const response = UrlFetchApp.fetch(url, options); Logger.log("信封发送成功: " + response.getContentText()); } catch (e) { Logger.log("发送信封出错: " + e.toString()); } }
3. 关键注意事项
- OAuth2库使用:必须先在脚本编辑器中添加OAuth2库,否则代码会报错。
- 敏感信息保护:客户端ID、密钥、刷新令牌都是敏感信息,不要直接写在代码里,建议存在脚本属性中,避免泄露。
- 权限范围:获取刷新令牌时,要请求
https://www.googleapis.com/auth/drive.readonly权限,确保令牌有读取Drive文件的权限。 - 访问令牌有效期:Google访问令牌有效期为1小时,脚本会自动用刷新令牌获取新的令牌,无需手动操作。
这样修改后,DocuSign就能通过带有有效访问令牌的URL,安全访问你的私有Google Drive PDF文件,解决未认证的错误问题。
内容的提问来源于stack exchange,提问作者Alex James
相关产品推荐
相关产品推荐

