正在尝试为 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秒
可以以毫秒为单位调整超时时间。
我想弄清楚我是否可以在 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秒
可以以毫秒为单位调整超时时间。