是否有一种方法可以从文本/事件流中获得单个响应而不使用事件侦听器?



我正在写一个脚本在谷歌表检索值从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)

相关内容

  • 没有找到相关文章

最新更新