【问题标题】:doGet(e) parameter undefineddoGet(e) 参数未定义
【发布时间】:2018-04-05 23:03:33
【问题描述】:

我正在尝试在 Google Apps 脚本 doGet(e) 方法中处理查询参数。我已经定义了以下简单的 doGet() 函数,它根据参数(或缺少参数)为不同的 html 提供服务。

function doGet(e) {
  Logger.log('In doGet');
  Logger.log('query params: ' + e);
  var isNull = (e.queryString == null);
  var len = e.parameters.length;
  Logger.log('query string is null: ' + isNull);
  Logger.log('number of params: ' + len);
  if (e.queryString == null) { //doesn't work!
    Logger.log('Serving loginUI');
    return HtmlService
    .createHtmlOutputFromFile('loginUI')
    .setSandboxMode(HtmlService.SandboxMode.IFRAME)
    .addMetaTag('viewport', 'width=device-width, initial-scale=1')
    .setTitle("Please log in");
  }
  //if here, we know query string is NOT null
  if (e.parameter.mode == "player") {
    return HtmlService
    .createHtmlOutputFromFile('playerUI')
    .setSandboxMode(HtmlService.SandboxMode.IFRAME)
    .addMetaTag('viewport', 'width=device-width, initial-scale=1')
    .setTitle("Following Player");
  }
  if (e.parameter.mode == "hole") {
    return HtmlService
    .createHtmlOutputFromFile('playerUI')
    .setSandboxMode(HtmlService.SandboxMode.IFRAME)
    .addMetaTag('viewport', 'width=device-width, initial-scale=1')
    .setTitle("Following Hole");
  } 
  if (e.parameter.mode == "flex") {
    return HtmlService
    .createHtmlOutputFromFile('flexUI')
    .setSandboxMode(HtmlService.SandboxMode.IFRAME)
    .addMetaTag('viewport', 'width=device-width, initial-scale=1')
    .setTitle("Flex Interface");
  }
}

从我的日志记录代码中可以看出,在最初调用 doGet() 时没有查询参数,我正在努力弄清楚 e 参数是什么。日志输出如下:

> [17-10-24 18:14:48:557 PDT] Starting execution [17-10-24 18:14:48:565
> PDT] Logger.log([In doGet, []]) [0 seconds] [17-10-24 18:14:48:566
> PDT] Logger.log([query params: [object Object], []]) [0 seconds]
> [17-10-24 18:14:48:566 PDT] Logger.log([query string is null: false,
> []]) [0 seconds] [17-10-24 18:14:48:567 PDT] Logger.log([number of
> params: undefined, []]) [0 seconds] [17-10-24 18:14:48:568 PDT]
> Execution succeeded [0.003 seconds total runtime]

如何处理e.parameters中没有查询参数的情况。在这种情况下,e 似乎是未定义的。有什么想法吗?

作为后续问题,我的想法是在与 doGet 提供的 html 文件关联的 javascript 中构建查询字符串。以上面代码中提到的“loginUI.html”文件为例,我想包含jquery代码,用不同的参数调用google.script.run.doGet(),如下:

<script>
  $("#playerUI").click(function () {
    var queryString = "?mode=player";
    google.script.run.doGet(queryString);
  });

  $("#holeUI").click(function () {
    var queryString = "?mode=hole";
    google.script.run.doGet(queryString);
  });

   $("#flexUI").click(function () {
    var queryString = "?mode=flex";
    google.script.run.doGet(queryString);
  });
</script>

我的感觉是这也行不通。请指教。

【问题讨论】:

  • 本网站上的问题应该包含一个且只有一个问题(请参阅How to Ask)。我建议您将“跟进”问题作为一个新问题发布。

标签: javascript jquery google-apps-script


【解决方案1】:

如何处理e.parameters中没有查询参数的情况。在这种情况下,e 似乎是未定义的。有什么想法吗?

简答

function doGet(e) {

  Logger.log('queryString is an empty string: ' + (e.queryString === ''));
  Logger.log('parameter hasn\'t members: ' + (Object.keys(e.parameter).length === 0));
}

说明

要将对象的内容写入 Google Apps 脚本编辑器日志,请使用 JSON.stringify(object)

例子:

function doGet(e) {
  Logger.log(JSON.stringify(e));
}

上面的代码在日志中打印出以下文字:

[17-10-24 21:13:28:414 CDT] {"parameter":{},"contextPath":"","contentLength":-1,"queryString":"","parameters" :{}}

如您所见,有几个命名值:

  • 参数:与请求参数对应的键/值对对象。对于具有多个值的参数,仅返回第一个值。
  • contextPath:未使用。始终为空字符串。
  • contentLength:对于 doGet 总是返回 -1
  • queryString:URL 的查询字符串部分的值。
  • parameters:类似于 e.parameter 的对象,但每个键都有一个值数组

参考

注意:第一个引用说 queryString 在未指定查询字符串时返回 null,但在我所做的测试中,这是不正确的。

【讨论】:

  • 谢谢@Rubén!空查询字符串的测试有效!在比较中我还需要一个等号('===')。关于后续问题的任何想法?如何调用 doGet() 并正确传递一个 queryString。我认为我提议的代码中的方法行不通。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多