【发布时间】:2015-09-10 00:32:36
【问题描述】:
我想将 Chrome 扩展程序与 Google 电子表格集成。
简而言之:我希望我的 Chrome 扩展程序打开电子表格并调用电子表格中包含的脚本之一。尤其是 JSON 数据(见最后更新)。
- 我在处理扩展方面的知识很好。
- 另外,我对在电子表格中创建绑定脚本的知识。
- 但是,我对 Google 网络应用程序、doGets 和类似的东西的了解非常混乱,他们的文档从我应该知道他们在说什么的地方开始,但我不知道.所以我需要关于事情如何流动的细节。在不知道代码应该是什么和在哪里的情况下谈论身份验证和其他东西似乎没有任何意义。
所以我需要一个详细的答案。而 where 部分是绝对必要的。
到目前为止,我有一个非常好的脚本可以运行(该脚本不是这个问题的范围),绑定到电子表格。 (脚本应该只为此工作表运行,因此保持绑定不是问题,除非出于技术原因)。
工作表需要获取一些外部数据(我无法控制)才能使用该数据运行脚本。如果我使用 UrlFetch 从电子表格中尝试它,我会遇到跨域问题,而 Google 会阻止我(如果你能帮助我绕过这个跨域问题,那也很好)。
在 Chrome 扩展程序中,附加到从其中检索数据的页面,我可以执行我需要的所有请求并实际获取数据,但是,我不知道如何将这些数据发送到工作表。
所以,我希望扩展程序和工作表相互交流。它不需要是双向的谈话。如果只是扩展程序可以在工作表中输入数据而不得到答案,它就可以工作。
这可以实现吗?
还有其他方法吗?
更新:
在@Peter Herrmann 的帮助下,我能够摆脱零。 doGet 和 doPost 已设置(如本问题末尾所示),现在我正在努力将“JSON”数据发送到工作表。我在单独的表格中创建了“JSON”和“JSONP”版本进行测试。
如果我在浏览器的导航栏中键入exec 链接,它可以正常工作(但我相信这只是一个“GET”,对吗?我可以通过导航栏发送 JSON 吗?强>)。
如果我使用浏览器的控制台发送XMLHttpRequest,它会带来以下错误,无论是脚本的“JSON”还是“JSONP”版本:
- Chrome 的控制台:“XMLHttpRequest 无法加载 https://script.google.com/macros/s/xxxx/exec。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,来源 https://xxxxxxxxx.com 是不允许访问。响应的 HTTP 状态代码为 405。”
- Mozilla 的控制台---“405 方法不允许”。
用于请求的代码是这样的:
var req = new XMLHttpRequest();
req.open("POST", "https://script.google.com/macros/.../exec", true);
req.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
req.send(JSON.stringify({d1:"hey", d2:"there"}));
但是,在这样的脚本标签中使用标准的“JSONP”请求是可行的(但这也不会将 JSON 发送到工作表,是吗?):
$("<script src='https://script.google.com/macros/s/AKfycbza11ABUxtxn-rcv-1v2ZM3uCzpARx1-t6KkPJk4rtAta_4SQc/exec?prefix=window.alert'></script>").appendTo($(document.head)).remove();
如果我尝试将请求代码放在脚本标签中,也会导致“不允许”错误。
在工作表代码中,相关部分是:
function doGet(request) {
var result = JSON.stringify({data: 'Thanks, I received the request'});
//JSON
return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);
//JSONP
result = request.parameters.prefix + "(" + result + ");";
return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JAVASCRIPT);
}
function doPost(request) {
var result = JSON.stringify({data: 'Thanks, I received the request'});
//JSON
return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);
//JSONP
result = request.parameters.prefix + "(" + result + ");";
return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JAVASCRIPT);
}
【问题讨论】:
标签: google-chrome-extension google-apps-script google-sheets xmlhttprequest urlfetch