我正在写一个脚本在谷歌表检索值从API。API每10秒提供一次text/event-stream
响应。是否有一种方法,我可以检索一个响应,而不使用异步函数或事件监听器?我在JavaScript方面不是很有能力,但因为我在Google Sheets工作,所以似乎异步函数和事件侦听器无法正常工作。从我学到的到目前为止,与text/event-stream
响应工作的唯一方法是使用EventSource
,但我不能使它与Google Sheets一起工作。
我的目标只是从端点检索一个响应,所以我可以在Google Sheets中完成的任何方式都会很棒。这里是端点,如果有帮助的话:
https://pool.rplant.xyz/api2/poolminer2x/raptoreum/RThRfoQJg8qsoStLk7QdThQGmpbFUCtvnk/UlRoUmZvUUpnOHFzb1N0TGs3UWRUaFFHbXBiRlVDdHZua3x4
因为我无法在谷歌表中使用EventStream
,我尝试使用在这里找到的polyfil: https://github.com/amvtek/EventSource/blob/master/dist/eventsource.js
,然后运行:
function getRplantTotal() {
var source = new EventSource('https://pool.rplant.xyz/api2/poolminer2x/raptoreum/RThRfoQJg8qsoStLk7QdThQGmpbFUCtvnk/UlRoUmZvUUpnOHFzb1N0TGs3UWRUaFFHbXBiRlVDdHZua3x4');
source.addEventListener("message", function(e) {
console.log(e.data);
});
}
但这只是输出:
3:11:49 PM Notice Execution started
3:11:49 PM Notice Execution completed
我相信你的目标是这样的。
- 你想从使用Google Apps Script的
https://pool.rplant.xyz/api2/poolminer2x/raptoreum/RThRfoQJg8qsoStLk7QdThQGmpbFUCtvnk/UlRoUmZvUUpnOHFzb1N0TGs3UWRUaFFHbXBiRlVDdHZua3x4
的URL检索第一个值,并希望在Google电子表格中使用检索到的值。
问题和解决方法:
当我看到https://github.com/amvtek/EventSource/blob/master/dist/eventsource.js
时,似乎请求是用XMLHttpRequest运行的。在Google Apps Script中,使用UrlFetchApp,而不能使用XMLHttpRequest。我想这可能就是你现在问题的原因。但不幸的是,在当前阶段,这不能使用text/event-stream
类型在谷歌应用程序脚本。当你的URL被UrlFetchApp请求时,它看起来像一个无限循环。这是目前的情况。
因此,从My goal is just to retrieve one response from the endpoint though, so any way I can accomplish that in Google Sheets would be great.
和上述情况来看,我想提出一个解决方案。当您在Google电子表格上运行脚本时,如何使用Javascript从URL检索值?Google Apps Script可以使用对话框和侧边栏从Javascript端检索值。根据您的问题,当使用Javascript时,可以检索值。我想这也许能派上用场。当这个解决方案在Google Apps脚本中反映出来时,如下所示:
示例脚本:
Google Apps Script side:Code.gs
请将以下脚本复制粘贴到Google Spreadsheet脚本编辑器的脚本文件中。
// Please run this function.
function main() {
SpreadsheetApp.getUi().showModalDialog(HtmlService.createHtmlOutputFromFile("index"), "sample");
}
function getValues(e) {
const obj = JSON.parse(e); // This is the 1st value from the URL of "https://pool.rplant.xyz/api2/poolminer2x/raptoreum/RThRfoQJg8qsoStLk7QdThQGmpbFUCtvnk/UlRoUmZvUUpnOHFzb1N0TGs3UWRUaFFHbXBiRlVDdHZua3x4"
console.log(obj)
// DriveApp.createFile("sample.txt", e); // When you use this, the retrieved value can be created as a text file.
}
Javascript端:index.html
请将以下脚本复制粘贴到Google Spreadsheet脚本编辑器的HTML文件中。请将文件名设置为index.html
。
Values are retrieving now. Please wait. After the values were retrieved, this dialog is automatically closed.
<script>
var source = new EventSource('https://pool.rplant.xyz/api2/poolminer2x/raptoreum/RThRfoQJg8qsoStLk7QdThQGmpbFUCtvnk/UlRoUmZvUUpnOHFzb1N0TGs3UWRUaFFHbXBiRlVDdHZua3x4');
source.addEventListener("message", function(e) {
source.close();
google.script.run.withSuccessHandler(google.script.host.close).getValues(e.data);
});
</script>
- 在此脚本中,请在脚本编辑器中运行
main()
函数。这样,在电子表格上打开一个对话框,使用Javascript从URL检索值,当检索到第一个值时,这些值被发送到Google Apps Script端。因此,您可以在getValues
函数中使用检索到的值。
注意:
在这个解决方案中,需要由浏览器执行脚本。因为使用了Javascript。所以,请注意这个
作为另一个解决方案,当你只能使用Javascript时,Sheets API可以与Javascript一起使用。在这种情况下,也可以使用Javascript检索值并将其放入电子表格。
引用:
- Google工作空间文档中的对话框和侧边栏 类google.script.run(客户端API)