【问题标题】:How to return values correctly using withSuccessHandler如何使用 withSuccessHandler 正确返回值
【发布时间】:2021-04-21 19:34:11
【问题描述】:

我又遇到了 google.script.run 的问题,这一次,我想从电子表格中检索数据。如果您发现错误,请随时将其写在答案中。

顺便说一下,这是我使用的一些代码:

HTML代码:

alert(GetData(0, 1, 1));

function GetData(Page, GetRow, GetColumn)
  {
    var DataExtracted;
    google.script.run.withSuccessHandler(function(Data){DataExtracted = Data;}).GetCellValue({PageNum: Page, Row: GetRow, Column: GetColumn});
    return DataExtracted;
  }

GS代码:

var Server = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/...');
//I'm not writing the Url, because of privacy
var Pages = Server.getSheets();
function GetCellValue(Object)
{
  return Pages[Object.PageNum].getRange(Object.Row, Object.Column).getValue();
}

【问题讨论】:

  • google.script.run.withSuccessHandler(call back function name).serverfunctionname() 中的 withSuccessHandler 是 serverfunctionname() 的返回值将返回到的函数的名称。它也可以是匿名函数。

标签: javascript html google-apps-script google-sheets


【解决方案1】:

HTML:

<script>
var DataExtracted;
function GetData(Page, GetRow, GetColumn) {
    google.script.run
    .withSuccessHandler(function(Data){
       DataExtracted=Data;//DataExtracted is global and available to other functions
       window.alert(Data);
    })
    .GetCellValue({PageNum: Page, Row: GetRow, Column: GetColumn});    
  }
</script> 

GS:

function GetCellValue(Object) {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getSheets()[Object.PageNum];//assuming numbers start at zero
  return sh.getRange(Object.Row, Object.Column).getValue();
}

通常在调用服务器函数和调用 withSuccessHandler 之间至少有几秒钟的时间。您可以在其他功能中使用 gData。就是服务端函数getCellValue()返回的值;

【讨论】:

  • 谢谢,另外,您知道将数据作为变量获取的方法吗?
  • 你的意思是这样的吗?:DataExtracted = Data;
  • 我刚改了名字。关键是您可以通过在函数之外声明它来传递给其他函数。
  • 哦,好的。顺便说一句,当我提醒变量时,它返回一个“未定义”值
  • 请更新您的代码,以便我可以看到您在说什么。并请提供 html,以便我可以重现问题。
【解决方案2】:
var DataExtracted;
GetData(0, 1, 1);
alert(DataExtracted);
function GetData(Page, GetRow, GetColumn)
  {
    google.script.run.withSuccessHandler(function(Data){DataExtracted = Data;}).GetCellValue({PageNum: Page, Row: GetRow, Column: GetColumn});
  }

【讨论】:

  • 没有。因为您在回调接收到数据之前调用 GetData() 和 alert()。将警报放在回调中。
  • 有时我会等待多达 30 或 45 秒才能收到回电。这种情况很少见,但有时确实会发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 2019-07-09
相关资源
最近更新 更多