Dan*_*ler 1 xmlhttprequest google-sheets urlfetch google-chrome-extension google-apps-script
我想将Chrome扩展程序与Google电子表格集成.
简单来说:我希望我的Chrome扩展程序能够打开电子表格并调用电子表格中包含的其中一个脚本.特别是JSON数据(参见最后的更新).
所以我需要一个详细的答案.而其中的部分是绝对必要的.
到目前为止,我有一个非常好的脚本运行(脚本不是这个问题的范围),绑定到电子表格.(该脚本应仅针对此工作表运行,因此除非出于技术原因,否则保持绑定不是问题).
工作表需要获取一些外部数据(我无法控制)来运行带有该数据的脚本.如果我使用电子表格进行尝试UrlFetch,我会遇到跨域问题而谷歌阻止我(如果你可以帮助我绕过这个跨域问题,它也会很棒).
在Chrome扩展程序中,附加到检索数据的页面,我可以执行所需的所有请求并实际获取数据,但之后,我不知道如何将此数据发送到工作表.
所以,我希望扩展和工作表能够相互通信.它不需要是双向谈话.如果只是扩展程序可以在工作表中输入数据而没有得到答案,则它可以工作.
这可以实现吗?
还有另一种方法吗?
更新:
在@Peter Herrmann的帮助下,我能够摆脱零.doGet并doPost设置(如此问题的结尾所示),现在我正在努力将"JSON"数据发送到工作表.我在单独的表中创建了"JSON"和"JSONP"版本以进行测试.
如果我exec在浏览器的导航栏中输入链接,它工作正常(但我相信这只是一个"GET",是吗?我可以通过导航栏发送JSON吗?).
如果我使用浏览器的控制台发送XMLHttpRequest它会带来以下错误,无论是脚本的"JSON"还是"JSONP"版本:
用于请求的代码是:
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"}));
Run Code Online (Sandbox Code Playgroud)
但是,在像这样的脚本标记中使用标准的"JSONP"请求是有效的(但是这不会将JSON发送到工作表,是吗?):
$("<script src='https://script.google.com/macros/s/AKfycbza11ABUxtxn-rcv-1v2ZM3uCzpARx1-t6KkPJk4rtAta_4SQc/exec?prefix=window.alert'></script>").appendTo($(document.head)).remove();
Run Code Online (Sandbox Code Playgroud)
如果我尝试将请求代码放在脚本标记内,它也会导致"不允许"错误.
在表格代码中,相关部分是:
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);
}
Run Code Online (Sandbox Code Playgroud)
您说要从Chrome扩展程序更新电子表格.您可以在脚本中使用ContentService公开更新功能,然后从您的扩展中调用该URL.这是一个在电子表格单元格中设置数据并返回消息的示例:
function doGet(request) {
//get the data from the request's "somedata" querystring parameter ..../exec?somedata=mydata
var data = request.parameters.somedata;
//update the bound spreadsheet (workaround https://code.google.com/p/google-apps-script-issues/issues/detail?id=5734)
SpreadsheetApp.openById('1cm6tK0Io4lnbRZ0OhlvZijhrQoqCt01adyYlUbZgUZY')
.getSheetByName('Sheet1')
.getRange('B1')
.setValue(data);
//send some data back as a response
var result = {
data: 'Thanks, I received: ' + data,
error: null
};
return ContentService.createTextOutput(JSON.stringify(result))
.setMimeType(ContentService.MimeType.JSON);
}
Run Code Online (Sandbox Code Playgroud)
去测试:
https: //script.google.com/macros/s/AKfycbyTi0NOZdTm5J_tZnUXw9skWfYlLADvkDDdCd593XC-H6LN4A/exec?somedata=ABC123到网址并点击隐身浏览器窗口中的完整网址.https://script.google.com/macros/s/AKfycbyTi0NOZdTm5J_tZnUXw9skWfYlLADvkDDdCd593XC-H6LN4A/exec?somedata=ABC123这导致在单元格B1和浏览器消息中设置"ABC123":{"data":"谢谢,我收到:ABC123","错误":null}
这是源电子表格的链接,您可以从中进行文件>制作副本.
| 归档时间: |
|
| 查看次数: |
1285 次 |
| 最近记录: |