最近我一直在做一个项目,该项目将数据从谷歌文档实时流式传输到谷歌电子表格。我一直在玩应用程序脚本API,并使用基于时间的触发器方法创建了一个每分钟更新一次的循环。我也知道应用程序脚本不允许for循环持续超过5分钟。所以,我的理论是,触发器每分钟调用的函数可以有一个循环,运行大约一分钟。问题是,我无法让一个函数在一分钟内每秒运行一次(甚至每两三秒运行一次(。下面的代码是我用来创建这个循环的,但我无法使它工作。它要么会在一两秒内非常快地通过数字,要么会不断地运行,永不停止。
function myfunction() {
let start = new Date().getTime()
const limit = 60;
let timeEllapsed = 0
for(i=0; i < 60; i++) {
let start = new Date().getTime()
while(true){
if(start > new Date().getTime + 1000) {
Logger.log(timeEllapsed)
timeEllapsed += 1
break
}
}
}
}
如何修复此问题,使for循环每秒只重复一次,并且脚本将在60秒后完成运行?
Apps脚本有一个sleep()
方法,它将暂停代码:
function myfunction() {
let start = 0;
var timeEllapsed = 0;
const limit = 60000;
const increment = 1000;//1000 milliseconds is 1 second
while(timeEllapsed < limit){
timeEllapsed += increment;
Utilities.sleep(1000);//Wait for 1 second
}
Logger.log(timeEllapsed);
}
60秒计时器:
HTML:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
<title><b>Output Folder</b></title>
</head>
<script>
var t=0;
var id='';
function increment() {
t+=1;
check(t);
document.getElementById('txt1').value=t;
google.script.run.onSecond(t);//Calls a server side function
}
function reset() {
clearInterval(id);
t=0;
}
function start() {
id=setInterval(increment,1000);
}
function check(t) {
if(t>=59) {
reset();
}
}
</script>
<body>
<input type="text" id="txt1" />
<br /><input type="button" value="Start" onclick="start();" />
<br /><input type="button" value="Stop" onclick="reset();" />
</body>
</html>
气体:
function onSecond(t) {
const ss=SpreadsheetApp.getActive();
const sh=ss.getActiveSheet();
sh.getRange(1,1).setValue(t);
}
function showTimerDialog() {
SpreadsheetApp.getUi().showSidebar(HtmlService.createHtmlOutputFromFile('ah1'));
}