【问题标题】:Google form that turns on and off each day automatically每天自动打开和关闭的 Google 表单
【发布时间】:2017-08-16 15:48:33
【问题描述】:

我喜欢 Google 表单,我可以用它们玩几个小时。我花了几天时间试图解决这个问题,寻找答案。这超出了我的想象。我见过类似的问题,但似乎没有一个能帮助我找到答案。我工作的地方有一家咖啡馆,我在 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));
   }

【问题讨论】:

  • 如果精度很关键,基于时间的触发器是不够的,因为触发器不能保证在指定的确切时间运行。触发器通常在定义的时间后 15 分钟内触发,并且该时间必须按小时间隔,因此 10:30 不是触发器的有效时间。为了获得所需的精度,您需要使用一个外部服务,该服务将在分配的时间触发通知,并让您的应用程序通过将其部署为 Web 应用程序并将其 url 用作 Webhook 来接收这些通知。复杂的东西。

标签: forms time google-apps-script automation google-forms


【解决方案1】:

我不认为你可以使用.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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    相关资源
    最近更新 更多