You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 12:34:57