【问题标题】:Google apps script, priority between onclick and hrefGoogle 应用脚本,onclick 和 href 之间的优先级
【发布时间】:2020-01-05 22:26:43
【问题描述】:

我有一个按钮(在 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 函数,它将触发我的谷歌应用脚​​本 (GS) 函数。然后触发的 GS 函数会将数据插入到我的电子表格中。同时,重定向的 URL 将通过我的 doGet() 函数。为了确定结果,它从我的电子表格中获取数据。我的问题是,在重定向页面采取行动之前,电子表格并不总是及时更新。

我解决问题的尝试是使用 while 循环等待/暂停。但是,当 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 see below 提供的答案以及我发现如果不强制更新数据,GS 中添加到电子表格的数据可能会延迟。要强制更新,请在 GS 函数中将数据插入电子表格后调用 SpreadsheetApp.flush(); link。据我了解,在我更改基于 (GS) 的页面之前,数据需要位于我的电子表格中,因为它会在调用基于 (GS) 的页面时尝试访问电子表格,而不是在我调用电子表格时当数据可用时(通过等待/使用 while 循环)。

【问题讨论】:

  • 感谢您的回复。对于给您带来的不便和我糟糕的英语水平,我深表歉意。我可以理解我的回答不适合你的实际情况。所以我必须删除我的答案,因为我不想混淆其他用户。我为我糟糕的技能深表歉意。
  • 嗨@Tanaike,没问题。不过,我确实认为你提出了一个有价值的建议。希望如果我一切都正确,我将能够很快发布解决方案。可能不像我最初预期的那样,但这将解决重定向页面问题。在那个时候(或之前),你也许可以提出一些你自己可以自豪地提出的建议。总而言之,我很欣赏你的回答:)。
  • 感谢您的回复。由于我的英语水平不佳,我无法正确理解您的目标。我想我必须为此道歉。另一方面,从你的问题,我可以学习。我想学习越来越多。也谢谢你。当您的问题得到解决时,我很高兴。

标签: url redirect google-apps-script priority-queue buttonclick


【解决方案1】:

用这个替换你的<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();
    }
}

当用户点击链接时,className 不是done,所以它会调用你的 GAS 函数并返回 false,所以 href 不会被打开。 GAS 功能完成后,它会设置className,然后再次设置点击链接。这次它返回 true,所以 href 会运行。

这有意义吗?

注意,您也可以使用withUserObject 传递来自a 的URL。

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

【讨论】:

  • 嗨@IMTheNachoMan,我想我明白你想说什么,但据我了解,Google Apps 脚本不允许使用window.location.href。换句话说,我收到以下消息:“Refused to display 'script.google.com/macros/s...' in a frame because it set 'X-Frame-Options' to 'sameorigin'.”跨度>
  • 哦。多哈。让我继续努力。
  • 嗨@IMTheNachoMan,我想你解决了我的问题。我只需要确保我可以更改第一个href,因为目前在一些尝试中我认为href-action 比onclick-action 更快。在当前状态下,它的行为与最初一样,但现在我认为代码应该允许修改(优先级)。
  • 您不需要这样做。 JavaScript onclick 首先运行。如果返回 false,则不会执行 href。我很确定。
  • 我的理解是,onclick 先行,只要它不返回 false,它就会处理 href。在您的情况下,onclick 运行异步,因此它启动第二个“线程”,然后返回,然后执行 href
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2013-09-30
  • 2017-07-01
  • 1970-01-01
  • 2013-09-12
相关资源
最近更新 更多