有没有一种方法可以在不使用事件监听器的情况下从文本/事件流中获取单个响应?

3
我正在Google Sheets中编写脚本,以从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

因为我无法在Google Sheets中使用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
1个回答

6

我相信你的目标如下。

  • 您希望使用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。我认为这可能是您当前问题的原因。但不幸的是,在当前阶段,Google Apps Script无法使用text/event-stream类型。当使用UrlFetchApp请求您的URL时,它看起来像是无限循环。这就是当前的情况。

因此,根据“我的目标只是从端点检索一个响应,所以在Google表格中实现这一目标的任何方法都很好”的说法,我想提出一个解决方法。当您在Google电子表格上运行脚本时,如何使用Javascript从URL检索值? Google Apps Script可以使用对话框和侧边栏从Javascript侧检索值。从您的问题来看,使用Javascript可以检索该值。我认为这可能会有所帮助。当在Google Apps Script中反映此解决方法时,如下所示。

示例脚本:

Google Apps Script侧:Code.gs

请将以下脚本复制并粘贴到Google电子表格的脚本编辑器的脚本文件中。

// 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一起使用。Ref 在这种情况下,也可以使用Javascript检索和放置值到电子表格中。
参考资料:
- Dialogs and Sidebars in Google Workspace Documents - Class google.script.run (Client-side API)

1
非常棒的解决方案!我以为在浏览器中运行一些JavaScript会很有用,但我甚至不知道你可以在Google表格中创建HTML文件。即使我意识到了这一点,我也不认为我能够得出这个解决方案。非常感谢! - Kyle Dixon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接