如何解决Google Apps Script调用Salesforce Bulk API 2.0的PUT请求报错问题
解决Google Apps Script调用Salesforce Bulk API 2.0时的METHOD_NOT_ALLOWED错误
你猜的完全没错——这个METHOD_NOT_ALLOWED错误根本不是因为你用了GET请求,而是Google Apps Script的UrlFetchApp在处理PUT请求的payload时偷偷做了手脚,导致Salesforce无法正确解析你的请求,才返回了这个误导人的错误提示。
问题出在哪?
当你在UrlFetchApp的配置里直接传字符串作为payload时,哪怕你指定了contentType: "text/csv",GAS默认还是会把这个payload当成表单数据处理:它会自动把Content-Type覆盖成application/x-www-form-urlencoded,还会对你的CSV内容做URL编码。这就导致Salesforce收到的请求完全不是它预期的CSV格式,于是返回了错误的方法不允许提示。
怎么修复?
要解决这个问题,你需要让GAS直接发送原始的CSV内容,而不是自动编码成表单。具体做法是把CSV字符串转换成Blob对象,然后把Blob作为payload传入:
var headers = { "Authorization": "Bearer TOKEN" }; // 将CSV文本转为Blob,明确指定MIME类型为text/csv var csvBlob = Utilities.newBlob("Id,Entity_Name__c\n001,One\n002,Two\n003,Three", "text/csv"); var options = { "method": "put", "contentType": "text/csv", "headers": headers, "payload": csvBlob, // 可选:关闭自动重定向,避免PUT请求被意外转换 "followRedirects": false }; var url = INSTANCE + "/services/data/v44.0/jobs/ingest/" + JOB_ID + "/batches"; UrlFetchApp.fetch(url, options);
为什么这样管用?
用Blob作为payload时,UrlFetchApp会直接发送Blob的原始内容,不会再做任何表单编码,同时会严格遵守你设置的text/csv内容类型。这样你的请求就和之前成功的cURL请求完全一致了,Salesforce就能正确识别这是一个合法的PUT上传请求。
额外要检查的点
- 确认你的作业状态是
Open或者UploadInProgress,Salesforce只允许在这些状态下上传批次,要是作业已经是UploadComplete或者Closed,也会触发奇怪的错误 - 检查你的访问令牌(TOKEN)是否有
API和Bulk API的权限 - 确保INSTANCE地址是正确的Salesforce实例域名(比如
https://na1.salesforce.com)
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

