[英]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。
這是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.