Google chrome extension 来自外部应用程序的调用绑定脚本-Google电子表格
我想将Chrome扩展与Google电子表格集成 简单地说:我希望我的Chrome扩展打开一个电子表格,并调用电子表格中包含的一个脚本。特别是JSON数据(见最后的更新)Google chrome extension 来自外部应用程序的调用绑定脚本-Google电子表格,google-chrome-extension,google-apps-script,google-sheets,xmlhttprequest,urlfetch,Google Chrome Extension,Google Apps Script,Google Sheets,Xmlhttprequest,Urlfetch,我想将Chrome扩展与Google电子表格集成 简单地说:我希望我的Chrome扩展打开一个电子表格,并调用电子表格中包含的一个脚本。特别是JSON数据(见最后的更新) 我在处理扩展方面的知识还不错 此外,我还了解如何在电子表格中创建绑定脚本 但是,我对谷歌网络应用、doGets和类似的东西的了解非常混乱,他们的文档从一个我应该知道他们在说什么的点开始,但我不知道。所以我需要关于事物如何流动的细节。在不知道代码应该是什么和在哪里的情况下谈论身份验证之类的事情似乎没有任何意义 所以我需要一个
- 我在处理扩展方面的知识还不错李>
- 此外,我还了解如何在电子表格中创建绑定脚本李>
- 但是,我对谷歌网络应用、doGets和类似的东西的了解非常混乱,他们的文档从一个我应该知道他们在说什么的点开始,但我不知道。所以我需要关于事物如何流动的细节。在不知道代码应该是什么和在哪里的情况下谈论身份验证之类的事情似乎没有任何意义李>
UrlFetch
从电子表格中尝试,我会遇到跨域问题,Google会阻止我(如果你能帮助我绕过这个跨域问题,那也太好了)
在Chrome扩展中,附加到检索数据的页面,我可以执行所有需要的请求并实际获取数据,但是,我不知道如何将这些数据发送到工作表。
因此,我希望分机和工作表能够相互通信。这不需要是双向的谈话。如果扩展插件可以在工作表中输入数据而不得到答案,那么它就工作了
这是可以实现的吗
还有别的办法吗
更新: 在@Peter Herrmann的帮助下,我成功地摆脱了困境
doGet
和doPost
已设置(如本问题末尾所示),现在我正努力将“JSON”数据发送到工作表。我在单独的表中创建了“JSON”和“JSONP”版本进行测试
如果我在浏览器的导航栏中键入exec
链接,它可以正常工作(但我相信这只是一个“GET”,对吗?我可以通过导航栏发送JSON吗?)
如果我使用浏览器控制台发送XMLHttpRequest
,它会带来以下错误,即脚本的“JSON”或“JSONP”版本:
- Chrome的控制台:“无法加载XMLHttpRequest。对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许源站”标头。因此不允许源站访问。响应的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发送到工作表,是吗?):
是的,当然有可能。但你的问题就目前而言,太开放了。你需要把它分解成2到3个不同的问题,并附上你已经编写和试用过的代码。然后有人可以帮你,而不是他们自己完成整个写作
与脚本通信的最简单方法是使用doGet()或doPost()。这可能有点让人困惑,试着多读一读,然后做谷歌文档中的例子。一旦你掌握了窍门,就很容易了。URLFetch是为向任意URL发出请求而设计的,因此跨域不应因此而出现。同样,除非您自己编写一些代码,否则请尝试一下,然后发布到这里,这很难帮助您。是的,当然有可能。但你的问题就目前而言,太开放了。你需要把它分解成2到3个不同的问题,并附上你已经编写和试用过的代码。然后有人可以帮你,而不是他们自己完成整个写作
与脚本通信的最简单方法是使用doGet()或doPost()。这可能有点让人困惑,试着多读一读,然后做谷歌文档中的例子。一旦你掌握了窍门,就很容易了。URLFetch是为向任意URL发出请求而设计的,因此跨域不应因此而出现。同样,除非您自己编写一些代码,否则请尝试一下,然后将其发布到此处,这很难提供帮助。您说您想从chrome扩展更新电子表格。您可以在脚本中使用公开更新函数,然后从扩展名调用该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);
}
要测试:
https://script.google.com/macros/s/akfycbyty0nozdtm5j_tznuxw9skwbylladvkdddcd593xc-H6LN4A/exec
?somedata=ABC123
,并从匿名浏览器窗口点击完整URL李>
这导致在单元格B1中设置“ABC123”,浏览器消息:{“数据”:“谢谢,我收到了:ABC123”,“错误:null}
这里有一个指向的链接,您可以从中归档>制作副本。您说您想从chrome扩展名更新电子表格。您可以在脚本中使用公开更新函数,然后从扩展名调用该URL。下面是一个在电子表格单元格和r中设置数据的示例
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);
}
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);
}
function doGet() {
return ContentService.createTextOutput('Hello, world!');
}
function doGet(request) {
var employees = {"employees": [ { "firstName": "John", "lastName": "Doe"}, { "firstName": "Anna", "lastName": "Smith"} ] }
return ContentService.createTextOutput(JSON.stringify(employees))
.setMimeType(ContentService.MimeType.JSON);
}
function doGet(e)
{
Logger.log( Utilities.jsonStringify(e) );
if (e.parameter.data)
{
var dataInQueryString = e.parameter['data']
// now we can write dataInQueryString to a spreadhseet using spreadhsheet api
return ContentService.createTextOutput('Content received : '+ dataInQueryString);
}
}