一个函数调用google.script.run工作onload而不是按钮onclick

时间:2018-04-19 12:21:48

标签: javascript

<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中,我得到了解决方案。制作表格并将按钮放在&lt; / form&gt;然后每当它被调用时,它都能完美无缺地工作。但是这个没有。是因为我已经调用了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函数,而是在这里创建了不同的copyof和loadofhis,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 - output'首先显示'Am I called Now'然后'failed'。同样,服务器端Logger.log显示成功。

我无法猜测,但如果这是一个事情,我将不得不创建另一个html和代码相同的功能相同但只是一个更改googlesheet被调用。这是浪费时间,精力和资源。

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

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

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

最近的发展: 1.分离html但仍然无法工作。 2.发现工作表的结构和Bulk的结构相同但数据值有问题。当我将批量数据复制到未显示的数据时,它显示出来了。不需要分离html,但数据中存在问题。

它解决了“timestamp”列中的问题。我正在为旧数据创建删除。然后再没有比较这张表的时间戳。因此,我记得我之前操纵过这个专栏 现在,我将学习如何在工作表中进行数据验证并指出。

如果从google工作表中检索数据,并且某列中var数据的值在某些行中具有不同的格式,尽管数据和所有函数都被成功调用,但它会返回失败。请注意,像我这样的新脚本编写者可以获益。

1 个答案:

答案 0 :(得分:0)

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

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

这是withFailureHandler返回的错误。

  

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

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

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

(srange是我用getValues提取数据的地方。) 这个解决方案的一个缺点是即使它可以工作,它还会增加一个“for loop”运行的东西(如果数据表很长,这样做需要很长时间,不是吗?)。在我的情况下,列表不会显示出来。

所以我用google搜索'谷歌脚本如何获取值作为谷歌表的字符串'然后

  

google app上的getValue()和getDisplayValue()之间的区别...   来了。

甚至没有打开它,我改变了我将getValues称为getDisplayValues()的地方。

sheet.getDataRange().getDisplayValues();

那很容易。

希望这有助于任何遇到此类问题的人。