如何通过Google Apps Script发送邮件时添加DocuSign电子签名请求?
实现通过Google Apps Script在邮件中附带DocuSign签名链接的方案
前提准备
- 注册DocuSign开发者账号,创建集成应用,获取集成密钥(Integration Key)、用户ID(User ID),并通过OAuth流程生成访问令牌(Access Token)和刷新令牌(Refresh Token)
- 确保你的GAS项目已启用
UrlFetchApp服务(默认已启用,若未开启可在编辑器「服务」面板中添加)
核心实现代码示例
1. 调用DocuSign API创建签名信封并获取签名链接
function createDocuSignEnvelope(pdfBlob, clientEmail, clientName) { // DocuSign API配置(测试环境,正式环境替换为https://www.docusign.net/restapi/v2.1) const baseUrl = "https://demo.docusign.net/restapi/v2.1"; const integrationKey = "你的集成密钥"; const userId = "你的用户ID"; const accessToken = "你的访问令牌"; // 构造签名信封请求体 const envelopeDefinition = { emailSubject: "请签署你的报价单", status: "sent", documents: [ { documentBase64: Utilities.base64Encode(pdfBlob.getBytes()), name: "报价单.pdf", documentId: "1" } ], recipients: { signers: [ { email: clientEmail, name: clientName, recipientId: "1", tabs: { signHereTabs: [ { documentId: "1", pageNumber: "1", xPosition: "100", yPosition: "100" // 根据你的PDF布局调整签名框位置 } ] } } ] } }; // 请求创建信封 const envelopeOptions = { method: "post", headers: { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json" }, payload: JSON.stringify(envelopeDefinition) }; const envelopeResponse = UrlFetchApp.fetch(`${baseUrl}/accounts/${userId}/envelopes`, envelopeOptions); const envelopeData = JSON.parse(envelopeResponse.getContentText()); // 获取收件人专属签名链接 const recipientViewOptions = { authenticationMethod: "email", email: clientEmail, returnUrl: "https://your-return-url.com", // 签名完成后的跳转地址,可填你的网站或Google表单 userName: clientName, clientUserId: "unique-client-id" // 自定义唯一用户标识 }; const viewOptions = { method: "post", headers: { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json" }, payload: JSON.stringify(recipientViewOptions) }; const viewResponse = UrlFetchApp.fetch(`${baseUrl}/accounts/${userId}/envelopes/${envelopeData.envelopeId}/views/recipient`, viewOptions); const viewData = JSON.parse(viewResponse.getContentText()); return viewData.url; // 返回签名链接 }
2. 修改原有邮件发送函数,嵌入签名链接
假设你原有发送报价单的函数为sendQuoteEmail,修改后:
function sendQuoteEmail(clientEmail, clientName, pdfBlob) { // 生成DocuSign签名链接 const signUrl = createDocuSignEnvelope(pdfBlob, clientEmail, clientName); // 构造带签名链接的邮件内容 const emailBody = ` 您好,附件是您的报价单,请查收。<br><br> 请点击下方链接完成电子签名:<br> <a href="${signUrl}">立即签署报价单</a> `; // 发送邮件(附带PDF附件和签名链接) GmailApp.sendEmail( clientEmail, "您的报价单及签署请求", "", // 纯文本内容留空,使用htmlBody渲染富文本 { htmlBody: emailBody, attachments: [pdfBlob.setName("报价单.pdf")], name: "你的公司名称" } ); }
关键注意事项
- 测试环境使用
demo.docusign.net,正式上线需切换为生产环境域名 - 访问令牌会过期,建议实现自动刷新令牌的逻辑,避免手动更新
- 签名框的
xPosition和yPosition需根据PDF实际布局调整,确保位置准确 - 确保你的DocuSign账号有足够额度发送签名请求
内容的提问来源于stack exchange,提问作者GAS developer
相关产品推荐
相关产品推荐

