2017-08-16 627 views
0

我喜歡Google表單,我可以和他們一起玩幾個小時。我花了好幾天的時間試圖解決這個問題,尋找答案。這是在我的頭上。我看到過類似的問題,但似乎沒有任何幫助我找到答案。我們在一家咖啡廳工作,並在Google表單上創建了預訂表單。這是很容易的部分。咖啡廳只能接受上午10:30前的預購。我希望表格在上午7點開放,每天上午10點30分關閉,以阻止人們在咖啡館無法處理他們的訂單時預先訂購。我使用http://labnol.org/?p=20707的非常有用的教程來啓動我,我已經添加並將其搞砸了,並設法返回到目前的外觀。它不工作,我無法繞過它。有一次,我設法關閉它,但是我無法重新啓用它!我發現它非常令人沮喪,任何解決這個問題的幫助都很棒。對我來說,這似乎很簡單,因爲它只需要在每天的特定時間打開和關閉。我不知道!請幫我一個人嗎?每天自動打開和關閉的Google表單

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

如果精度很關鍵,基於時間的觸發器將不夠用,因爲觸發器不能保證在指定的確切時間運行。 觸發器通常定義觸發後的時間,到時候必須落在每小時一班,所以10:30是不是一個觸發的有效時間爲15分鐘之內。爲了獲得所需的精確度,您需要使用外部服務,該服務會在指定時間觸發通知,並讓您的應用程序通過將其部署爲Web應用程序並將其網址用作Webhook來接收這些通知。複雜的東西。 –

回答

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; 
}