簡體   English   中英

調用google.script.run的函數可以在加載時工作,但在onclick上不能工作

[英]a function calls google.script.run works onload but not the button onclick

<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腳本。 部署為網絡。 所有這些都有可能挖掘該站點。 但是我無法通過搜索解決我的這個問題。

我在Google腳本中發現onclick按鈕並非總是按預期運行。 無論如何,在另一個html中,我可以解決該問題。 創建一個表單並將按鈕放置在</ form>之后,然后每次調用它時,它就可以正常工作。 但這不是。 是因為我已經打電話給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';
}     

仍在調用失敗。 至於正在進行的過程,“ div-輸出”首先顯示“我叫我現在是”,然后顯示“失敗”。 同樣,服務器端Logger.log顯示成功。

我無法猜測,但是如果這是事實,我將不得不創建另一個html並以相同的方式編寫相同的函數,但是只需更改一個Googlesheet即可。 這是浪費時間,精力和資源。

**我將這些腳本放在正文的底部,以防元素尚未加載。 並使windows.onload調用onSuccess並按預期工作。

除了單獨制作每個html之外,您能否建議解決方法?

我的最后一招是單獨創建此javascript文件並使用它進行包含。 然后,隨着按鈕的點擊,使用iframe在其中調用不同的頁面。……我想最終建立一個一頁解決方案。

最近的發展:1.分離了html,但cNow仍然無法使用。 2.發現工作表的結構和批量的結構相同,但數據值有誤。 當我將批量數據復制到未顯示的數據時,它顯示了。 無需分開html,但問題出在數據上。

解決此問題的原因是列在“時間戳”列中。 我正在為舊數據創建deleterow。 然后再次不比較此工作表的時間戳。 因此,我記得我早些時候操縱過此專欄。
現在,我將學習如何在工作表中進行數據驗證並指出要點。

如果從Google工作表中檢索數據,並且在某些行中一列中var數據的值在某些行中具有不同的格式,盡管該數據和所有函數都被成功調用,但它會返回失敗。 請注意,以便像我這樣的新腳本編寫者可以受益。

答案摘要是,如果要使用javascript處理數據,請使用getDisplayValues而不是getValues。

最初似乎是編碼問題,但問題在於數據值。 然后我發現不支持將時間/日期格式傳遞給Javascript。

這是FailureHandler返回的錯誤。

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

我找到了一種使用數組推送的方法。 但是我無法弄清楚它是如何工作的,也不能解決我的問題。

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

(范圍是我使用getValues提取數據的位置。)該解決方案的一個缺點是,即使它可以正常工作,它也會添加另一件事來運行“ for循環”(如果數據表很長,這樣做會花費很長時間,是不是?) 就我而言,該列表仍不會顯示。

所以我用谷歌搜索了“谷歌腳本如何獲取值作為谷歌表的字符串”然后

出現了谷歌應用程序上的getValue()和getDisplayValue()之間的區別。

甚至沒有打開它,我將調用getValues的位置更改為getDisplayValues()。

sheet.getDataRange().getDisplayValues();

那很容易。

希望這對遇到此類問題的人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM