Google 应用程序脚本,onclick 和 href 之间的优先级

Google apps script, priority between onclick and href

我有一个按钮(在 HTML 中),它既调用函数 LoginInfoInput(...) 又重定向到页面 (href="...") ,即:

<a onclick="LoginInfoInput('<?!= userID; ?>')" href="<?= ScriptApp.getService().getUrl(); ?>?v=form&userID=<?!= userID; ?>" class="waves-effect waves-light btn-large">Log In</a>,

其中 LoginInfoInput(...) 是一个 javascript 函数,它将触发我的 google 应用程序脚本 (GS) 函数。然后,触发的 GS 函数会将数据插入到我的电子表格中。同时,重定向的 URL 将通过我的 doGet() 函数。为了确定结果,它从我的电子表格中获取数据。我的问题是电子表格并不总是在重定向页面采取行动之前及时更新。

我尝试通过 while 循环 wait/pause 来解决这个问题。然而,当 while 循环处于活动状态时,数据在电子表格中变得可用(至少在视觉上)不起作用,即,无法访问感兴趣的数据。请注意,我还在 while 循环期间添加了更新存储电子表格数据的变量的选项(调用 SpreadsheetApp.openByUrl(url)),但是没有任何改进。

更新

我的LoginInfoInput()(在JavaScript)如下:

function LoginInfoInput(userID){
  var userLO = document.getElementById("id_loginLO").value;
  var userPassword = document.getElementById("id_password").value;

  google.script.run.LoginAdd(userLO, userPassword, userID); 
}

解决方案

我的解决方案是将@IMTheNachoMan and my discovery that the added data in GS to Spreadsheet can be delayed if not forcing the data to be updated. To force an update, one call SpreadsheetApp.flush(); link 在电子表格中插入数据后在 GS 函数中提供的答案组合起来。据我了解,在我更改基于 (GS) 的页面之前,数据需要在我的电子表格中,因为它会在我的基于 (GS) 的页面被调用时尝试访问电子表格,而不是在我调用我的电子表格时当数据可用时(通过 waiting/using while-loop)。

将您的 <a... 替换为:

<a onclick="return LoginInfoInput(this, '<?!= userID; ?>');" href="<?= ScriptApp.getService().getUrl(); ?>?v=form&userID=<?!= userID; ?>" class="waves-effect waves-light btn-large">Log In</a>

用这个替换你的函数:

function LoginInfoInput(a, userID)
{
    if(a.className == "done")
    {
        return true;
    }
    else
    {
        google.script.run.withSuccessHandler(function(){
            a.className = "done";
            a.click();
        }).LoginAdd();
    }
}

当用户点击 link 时,className 不是 done 所以它调用你的 GAS 函数并且 returns false 所以 href 不是打开。 GAS 函数完成后,它会设置 className,然后再次设置点击 link。这次 returns 为真所以 href 会得到 运行.

这有意义吗?

请注意,您还可以使用 withUserObject 来传递 a 中的 URL。

参考:https://developers.google.com/apps-script/guides/html/reference/run