【问题标题】:Unable to return Array [Google apps script]无法返回数组 [Google 应用脚本]
【发布时间】:2014-07-17 15:24:31
【问题描述】:

我们有问题。我们现在的代码可以工作,但我们无法让数组返回 html 页面。我们从 html 页面发送一个数字,然后发生 returnData 函数。在执行过程中,它会通过 loopsheetGewoon,然后返回一个数组。数组返回returnData,函数以数组的返回结束。

问题是,当我们尝试将数组获取到 html 页面以便我们可以从电子表格中获取单个数据时,它返回未定义。我们还尝试将 javascript 值传递给 google 应用程序脚本代码,但没有奏效。

function loopSheetGewoon(data, studentNr){
    var SpreadSheetKeyA = "1h8fDwCUUPHRdmTHu-5gMyqU294ENZxCZcHCNCuN6r_Y";
    var sheet1 = SpreadsheetApp.openById(SpreadSheetKeyA).getActiveSheet();
    var array = [];
    for (var y = 0; y < data.length; ++y ) {
        var datum = Utilities.formatDate(data[y][0], "CET", "dd-MM-yyyy hh:mm");
        var nummer = data[y][2];
        if(studentNr.equals(nummer)){
            for (var x = 0; x < 35; x++ ) {
                array.push(data[y][x]);
            }
            return array;        
        }    
    }
}

下面是启动的函数。

function returnData(stuNr){
    var SpreadSheetKeyA = "1h8fDwCUUPHRdmTHu-5gMyqU294ENZxCZcHCNCuN6r_Y";
    var sheet1 = SpreadsheetApp.openById(SpreadSheetKeyA).getActiveSheet();
    var data = sheet1.getDataRange().getValues();
    var array = [];
    array = loopSheetGewoon(data, stuNr);
    Logger.log(array);
    return array;
}

下面是我们从 html 页面运行的函数。单击按钮时,它会向 returnData 函数发送一个数字(存储为字符串值)。它现在应该用数组填充变量 d,但是它一直返回 undefined。

$("#oph").click(function ophalen(){
    var s = $("#nummer").val();
    var displayEl = document.getElementById("nummer");
    var d = [];
    alert(s);
    d = google.script.run.returnData(s);

    //for( var y = 0; y < d.length(); ++y){
        //var naam = data[y][1];
        //var studentnr = data[y][2];
        //var document = data[y][32];
    //}
    alert(d);
    var div = document.getElementById('block');
    div.innerHTML = naam;
});

所以我不确定我们做错了什么,因为函数本身可以正常工作,直到它返回到 html 页面。

【问题讨论】:

  • 不应该studentNr.equals(nummer) 引发异常吗?.. Javascript String 对象没有equals 函数。另外,您是否在returnData 函数中的data 变量中获得了有意义的值?
  • @pckill 我在那里也不例外,除非电子表格本身将其保存为 int 值,但这似乎很奇怪。数据变量只是当前电子表格中的所有数据,它与数字一起传递给下一个函数。之后执行的函数可以正常工作,因为Logger.log(array) 在返回数组之前向我显示了我想要的数组。

标签: javascript jquery html arrays google-apps-script


【解决方案1】:

google.script.run: 返回 void — 此方法是异步的,不会 直接返回;但是,服务器端函数可以返回一个 值作为传递给成功处理程序的参数给客户端;还, 返回类型受到与参数类型相同的限制, 除了表单元素不是合法的返回类型

你应该这样做:

var onSuccess = function(d){
    //for( var y = 0; y < d.length(); ++y){
        //var naam = data[y][1];
        //var studentnr = data[y][2];
        //var document = data[y][32];
    //}
    alert(d);
    var div = document.getElementById('block');
    div.innerHTML = naam;
}

$("#oph").click(function ophalen(){
    var s = $("#nummer").val();
    var displayEl = document.getElementById("nummer");
    var d = [];
    alert(s);
    google.script.run.withSuccessHandler(onSuccess).returnData(s);
});

【讨论】:

  • 似乎不起作用。 Onclick 发生,功能正在运行,但似乎没有发出警报。如果你放一个变量 `var g =google.script.run.withSuccesHandler(onSucces).returnData(s);`,然后你提醒它,它会返回 undefined。我不确定为什么它不起作用。
  • 引用我的话——“这个方法是异步的”。您的 g 变量应该是未定义的。你能检查一下chrome开发者工具中的网络选项卡,看看服务器的响应是什么?
【解决方案2】:

不幸的是,google.script.run 的记录限制之一(截至 2019 年 3 月仍然有效)是您不能以任何方式传递 Date 对象,包括作为数组的一部分。

您可以在范围上调用 getDisplayValues() 而不是 getValues() 以仅获取字符串数组开头,或者您可以通过处理 getValues() 数组将 Date 对象转换为字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多