【问题标题】:a function calls google.script.run works onload but not the button onclick调用 google.script.run 的函数在加载时有效,但按钮在点击时无效
【发布时间】:2018-09-29 22:53:15
【问题描述】:
<script>
  window.onload = function() {
  google.script.run.withSuccessHandler(Loadthis)
  .getDataBySheetName('Bulk','all');
}

function Loadthis(data) {
  document.getElementById("output").innerHTML = "Loading...wait";
  var select = document.getElementById('trythis');
  var html = "";
  select.innerHTML = html;
  for ( var i in data) {
    html += "<tr>";
    for (var j=0;j<data[i].length;j++) {
      html += "<td>"+data[i][j]+"</td>";
    }
    html += "</tr>";
    select.innerHTML = html;
  }
  document.getElementById("output").innerHTML = "";
}

我正在使用谷歌脚本。部署为网络。所有这些都是可能的挖掘这个网站。但我无法通过搜索解决我的这个问题。

我在 google 脚本中发现 onclick 按钮并不总是按预期工作。无论如何,在另一个 html 中,我可以解决它。制作一个表单并将按钮放在 之后,然后每次调用它时,它都能完美运行。但是这个没有。是因为我已经调用了onload吗?在用户(我)单击按钮之前,我应该让页面为空吗?但我想在启动时显示默认报告。

问题是当我在 window.onload 中使用函数时,google.script.run.... 会转到 withSuccessHandler 来完成。但是,当我单独声明该函数并让它在单击按钮时发生时,google.script.run... 会进入 withFailureHandler。

document.getElementById("List").onclick = function() {
  var sheetname = 'cNow';
  alert('Am I called '+sheetname);
  getit(sheetname);
}

在这里,出现警报。所以它一定是被调用了。

然后

function getit(sheetname){
  var div = document.getElementById('output');
  div.innerHTML = 'Am I called '+sheetname;
  google.script.run
        .withSuccessHandler(Loadthis)
        .withFailureHandler(onFailure)
        .getDataBySheetName(sheetname,'all');
}

然后,在此之后,我可以看到服务器端 Logger.log 处理成功,就像在 onload 中调用它一样。

但接下来发生的是 onFailure 被调用。 因此,我没有调用相同的 Loadthis 函数,而是在这里制作了不同的副本 Loadthis , onSuccess 并调用了

function getit(sheetname){
  var div = document.getElementById('output');
  div.innerHTML = 'Am I called '+sheetname;
  google.script.run
    .withSuccessHandler(onSucess)
    .withFailureHandler(onFailure)
    .getDataBySheetName(sheetname,'all');
}

function onSuccess(data2) {
     var div = document.getElementById('output');
     div.innerHTML = "Loading...wait";

     var select = document.getElementById('trythis2');
     var html = "";
     select.innerHTML = html;
     for ( var i in data2) {
       html += "<tr>";
       for (var j=0;j<data2[i].length;j++) {
         html += "<td>"+data2[i][j]+"</td>";
       }
       html += "</tr>";
       select.innerHTML = html;
     }
     document.getElementById("output")
        .innerHTML = "Now list loaded...";
}
function onFailure(status) {
     var div = document.getElementById('output');
     div.innerHTML = 'failed';
}     

仍然调用 onFailure。至于正在进行的过程,“div - 输出”首先显示“我现在打电话了吗”然后“失败”。同样,服务端 Logger.log 显示成功。

我无法猜测,但如果这是事实,我将不得不创建另一个 html 并编写相同的函数,但只需更改要调用的 googlesheet。这是浪费时间、精力和资源。

** 我已将这些脚本放在正文底部,以防元素尚未加载。并让 windows.onload 调用 onSuccess 并按预期工作。

除了分别制作每个 html 之外,您能否建议解决方法?

我最后的办法是单独创建这个 javascript 文件并使用它来包含。然后在单击按钮时使用 iframe 在其中调用不同的页面........我想最终构建一页解决方案..虽然。

近期发展: 1.分离了html,但cNow还是不行。 2.发现sheet的结构和Bulk的结构一样,但是数据值有问题。当我将批量数据复制到未显示的数据中时,它显示了。无需单独的 html,但问题出在数据中。

它已解决,因为问题位于“时间戳”列中。我正在为旧数据创建删除行。然后再次不比较此工作表的时间戳。因此我记得我之前操作过这个专栏。
现在我要学习如何在工作表中进行数据验证和注意事项。

如果从google sheet中检索到数据,并且var data在某一列中的值在某些行中有不同的格式,虽然数据和所有函数调用成功,但返回失败。只是要注意,以便像我这样的新脚本编写者可以从中受益。

【问题讨论】:

  • “工作”示例中的sheetname 与不工作的示例不同。
  • 感谢您的快速浏览。是的。因为我想通过单击按钮来调用不同的列表。加载时,将显示report1,并应显示onclick report2。它一直工作到服务器端。一切都被调用并返回准备传递的数据。 Logger.log 是这么说的……
  • 来自作者本人的评论,问题已解决。如何将其标记为已修复?
  • 如果您自己解决了问题,然后在下面添加您自己的答案,您甚至可以将自己的答案标记为已接受 - 请参阅 stackoverflow.com/help/self-answer 。您可能需要先获得少量的声望。或者,如果修复是微不足道的并且可能对其他人不感兴趣,那么您可以完全删除该问题。
  • @ADyson 干杯。我可以添加答案。起初我根本没有看到按钮。

标签: javascript


【解决方案1】:

如果要使用 javascript 处理数据,则答案摘要是使用 getDisplayValues 而不是 getValues。

一开始似乎是编码问题,但它是在数据值上。 然后我发现不支持将时间/日期格式传递给 Javascript。

这是使用FailureHandler 返回的错误。

ScriptError:脚本已完成,但返回的值不是受支持的返回类型。

我找到了一种使用数组推送的方法。但我无法弄清楚它是如何工作的,也没有解决我的问题。

var options=[];
for(var i=0;i<srange.length;i++)
{
  options.push(srange[i][3]);
}

(srange 是我使用 getValues 提取数据的地方。) 这个解决方案的一个缺点是,即使它有效,它也会增加一个运行“for循环”的东西(如果数据表很长,这样做会花费很长时间,不是吗?)。就我而言,列表不会显示。

所以我用谷歌搜索了“谷歌脚本如何将值作为谷歌表的字符串”然后

谷歌应用上getValue()和getDisplayValue()的区别... 来了。

甚至没有打开它,我将调用 getValues 的位置更改为 getDisplayValues()。

sheet.getDataRange().getDisplayValues();

就这么简单。

希望这对遇到此类问题的人有所帮助。

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    相关资源
    最近更新 更多