我喜欢谷歌表格我可以和他们玩几个小时。我花了好几天试图解决这个问题,寻找答案。这是我的头脑。我见过类似的问题,但似乎没有一个能帮助我得到答案。我工作的咖啡馆,我在Google表格上创建了一个预订表单。这很容易。咖啡厅仅接受截至上午10:30的预订。我希望该表格每天早上7点开放,每天早上10:30关闭,以阻止人们在咖啡馆无法处理订单时预先订购。我使用了来自http://labnol.org/?p=20707的非常有用的教程来启动我,我添加并搞砸了它并设法回到下面,这是目前的样子。它不起作用,我无法理解它。有一次,我设法将其关闭,但我无法将其关闭!我发现它非常令人沮丧,任何帮助解决这个问题都会令人惊讶。对我而言似乎非常简单,因为它只需要在每天的某个时间打开和关闭。我不知道!请帮帮我一个人?
FORM_OPEN_DATE = "7:00";
FORM_CLOSE_DATE = "10:30";
RESPONSE_COUNT = "";
/* Initialize the form, setup time based triggers */
function Initialize() {
deleteTriggers_();
if ((FORM_OPEN_DATE !== "7:00") &&
((new Date()).getTime("7:00") < parseDate_(FORM_OPEN_DATE).getTime ("7:00"))) {
closeForm("10:30");
ScriptApp.newTrigger("openForm")
.timeBased("7:00")
.at(parseDate_(FORM_OPEN_DATE))
.create(); }
if (FORM_CLOSE_DATE !== "10:30") {
ScriptApp.newTrigger("closeForm")
.timeBased("10:30")
.at(parseDate_(FORM_CLOSE_DATE))
.create(); }
if (RESPONSE_COUNT !== "") {
ScriptApp.newTrigger("checkLimit")
.forForm(FormApp.getActiveForm())
.onFormSubmit()
.create(); } }
/* Delete all existing Script Triggers */
function deleteTriggers_() {
var triggers = ScriptApp.getProjectTriggers();
for (var i in triggers) {
ScriptApp.deleteTrigger(triggers[i]);
}
}
/* Allow Google Form to Accept Responses */
function openForm() {
var form = FormApp.getActiveForm();
form.setAcceptingResponses(true);
informUser_("Your Google Form is now accepting responses");
}
/* Close the Google Form, Stop Accepting Reponses */
function closeForm() {
var form = FormApp.getActiveForm();
form.setAcceptingResponses(false);
deleteTriggers_();
informUser_("Your Google Form is no longer accepting responses");
}
/* If Total # of Form Responses >= Limit, Close Form */
function checkLimit() {
if (FormApp.getActiveForm().getResponses().length >= RESPONSE_COUNT ) {
closeForm();
}
}
/* Parse the Date for creating Time-Based Triggers */
function parseDate_(d) {
return new Date(d.substr(0,4), d.substr(5,2)-1,
d.substr(8,2), d.substr(11,2), d.substr(14,2));
}
答案 0 :(得分:0)
我认为你不能使用.timebased('7:00');
在你尝试创建一个触发器之前检查你没有触发器是很好的,所以我喜欢这样做。你只能指定你想在某个时刻触发一个触发器,比如7个。触发器将在7到8之间随机选择。所以你真的不能选择10:30。它必须是10或11.如果你想要更高的精确度,你可能必须提前触发你的每日触发,然后计算一些5分钟的触发器让你更接近标记。你必须等到第一个小时看到每日触发器的位置。一旦它们被设定,它们就不会改变。
我实际上已经在日志中使用日常计时器来创建新计时器,直到我得到一个足够接近我所需时间的计时器,然后我关闭其他计时器并保留它。你必须要有耐心。只要您通过日志中的函数名称来识别触发器,就可以更改函数并保持计时器的运行。
哦,我通常用驱动器记事本创建日志文件,然后每当我想查看日志时就打开它。
function formsOnOff()
{
if(!isTrigger('openForm'))
{
ScriptApp.newTrigger('openForm').timeBased().atHour(7).create()
}
if(!isTrigger('closeForm'))
{
ScriptApp.newTrigger('closeForm').timeBased().atHour(11)
}
}
function isTrigger(funcName)
{
var r=false;
if(funcName)
{
var allTriggers=ScriptApp.getProjectTriggers();
var allHandlers=[];
for(var i=0;i<allTriggers.length;i++)
{
allHandlers.push(allTriggers[i].getHandlerFunction());
}
if(allHandlers.indexOf(funcName)>-1)
{
r=true;
}
}
return r;
}
我有时在我的计时器上运行一个日志条目,这样我就可以确切地知道它们何时发生。
function logEntry(entry,file)
{
var file = (typeof(file) != 'undefined')?file:'eventlog.txt';
var entry = (typeof(entry) != 'undefined')?entry:'No entry string provided.';
if(entry)
{
var ts = Utilities.formatDate(new Date(), "GMT-6", "yyyy-MM-dd' 'hh:mm:ss a");
var s = ts + ' - ' + entry + '\n';
myUtilities.saveFile(s, file, true);//this is part of a library that I created. But any save file function will do as long as your appending.
}
}
这是我的实用程序保存文件功能。您必须提供defaultfilename和datafolderid。
function saveFile(datstr,filename,append)
{
var append = (typeof(append) !== 'undefined')? append : false;
var filename = (typeof(filename) !== 'undefined')? filename : DefaultFileName;
var datstr = (typeof(datstr) !== 'undefined')? datstr : '';
var folderID = (typeof(folderID) !== 'undefined')? folderID : DataFolderID;
var fldr = DriveApp.getFolderById(folderID);
var file = fldr.getFilesByName(filename);
var targetFound = false;
while(file.hasNext())
{
var fi = file.next();
var target = fi.getName();
if(target == filename)
{
if(append)
{
datstr = fi.getBlob().getDataAsString() + datstr;
}
targetFound = true;
fi.setContent(datstr);
}
}
if(!targetFound)
{
var create = fldr.createFile(filename, datstr);
if(create)
{
targetFound = true;
}
}
return targetFound;
}