正在尝试为 google 脚本设置超时 UI 警报

Attempting to make a Timeout for a google script UI alert

我想弄清楚我是否可以在 google 脚本中的 UI 警报中自动神奇地 select 否..

var old = e.oldValue;
var ui = SpreadsheetApp.getUi() ;
if( old == null ){} else{ 
if( old == "NO"){} else {
if(e.range.getRow() == 3 ) {} 
else{ var response = ui.alert('⚠️ Change order? ⚠️', 'Are you sure you want to change this order?',ui.ButtonSet.YES_NO)}}} ;
if(response == ui.Button.NO) {e.range.setValue(old)} ;

这就是我所在的位置,一切正常....只要按下一个按钮,我希望有一种方法可以在大约 20 秒后自动按“否”。

我相信你的目标如下。

  • 您希望在打开对话框 20 秒后自动 运行 脚本,如单击“否”按钮。

修改点:

  • 遗憾的是,在当前阶段,SpreadsheetApp.getUi().alert()无法实现倒计时。所以针对你的情况,为了达到你的目的,我建议使用自定义对话框。使用自定义对话框时,可以使用Javascript。这样倒计时就可以用了。

以上几点反映到一个脚本中,就变成了下面这样。

示例脚本:

Google Apps 脚本端:

请将以下脚本复制并粘贴到电子表格脚本编辑器的Code.gs中。

function processForNo(value) {
  // do something
  Browser.msgBox(`Clicked NO. Retrueved value is '${value || ""}'.`);
}

function processForYes(value) {
  // do something
  Browser.msgBox(`Clicked YES. Retrueved value is '${value || ""}'.`);
}

// Please run this function.
function main() {
  var value = "ok";
  var html = HtmlService.createTemplateFromFile("index");
  html.value = value;
  SpreadsheetApp.getUi().showModalDialog(html.evaluate().setHeight(100), '⚠️ Change order? ⚠️');
}

HTML & Javascript:

请将以下脚本复制并粘贴到电子表格脚本编辑器的index.html中。

Are you sure you want to change this order?
<input type="button" id="yes" value="YES" onclick="google.script.run.withSuccessHandler(google.script.host.close).processForYes()">
<input type="button" id="no" value="NO" onclick="processForNo('')">
<script>
const processForNo = _ => google.script.run.withSuccessHandler(google.script.host.close).processForNo(<?= value ?>);
setTimeout(processForNo, 20000);
</script>
  • 当上述脚本的 main() 为 运行 时,将打开一个对话框。当您不点击按钮时,对话框会在 20 秒后关闭,过程与点击“否”按钮相同 运行。那时,processForNo就是运行。此外,该值可以在打开对话框时发送。
  • 单击“是”按钮时,processForYes为运行。

测试:

上面脚本测试时,得到如下情况。

注:

  • 以上脚本为确认脚本的示例脚本。当上面的脚本包含在你的脚本中时,它变成如下。

    • Google Apps 脚本端

        function myFunction() {
      
          // do something. I cannot understand about your whole script. So please add your actual script and function name.
      
          var old = e.oldValue;
          var ui = SpreadsheetApp.getUi();
          if (old == null) {
          } else {
            if (old == "NO") {
            } else {
              if (e.range.getRow() == 3) {
              } else {
                var html = HtmlService.createTemplateFromFile("index");
                html.value = old;
                ui.showModalDialog(html.evaluate().setHeight(100), '⚠️ Change order? ⚠️');
              }
            }
          }
        }
      
        function processForNo(old) {
          // do something
        }
      
        function processForYes(value) {
          // do something
        }
      
    • HTML & Javascript 方面与上述示例脚本相同。

  • 虽然我无法从你的问题中确认你的函数名称,但从你脚本中的 var old = e.oldValue 来看,我认为你可能正在使用简单触发器的 OnEdit 触发器。如果我的理解是正确的,当你使用上面的脚本时,请使用可安装的 OnEdit 触发器。这样,当编辑单元格时,showModalDialog 起作用。 Ref

参考文献:

这不是您想要的。

因为它不要求是或否。它只是显示超时消息。不过我觉得可以根据你的要求修改。

function showTimeoutAlert(header, message, time){

  SpreadsheetApp.getUi().showModelessDialog(
    HtmlService.createHtmlOutput(
      '<div>'+ message + '</div>' +
      '<script> \
  var a = document.querySelector("div"); \
  a.addEventListener("click",()=>{setTimeout(google.script.host.close,'+ time +')}); \
  a.click(); \
  </script>'
    ).setHeight(50),
    header
  );

}

像这样使用它:

showTimeoutAlert("No serial number(s) found", "Sr. No(s) 2, 3 not found", 2000)

这条信息会显示2秒

可以以毫秒为单位调整超时时间。