2017-08-16 10 views
0

Googleフォームが大好きです。私は答えを探して、この1つを解決しようと努力しました。それは私の頭の上にあります。私は似たような質問を見たことがありますが、私は答えに手伝ってくれたようでした。私は働いているカフェを持っていて、Googleフォームで予約注文フォームを作成しました。それは簡単な部分でした。カフェでは、午前10時半までの予約注文のみ受け付けています。毎日午前7時から午前10時半までにフォームを開き、カフェが注文を処理できない場合に事前予約を停止します。私は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分以内に発火し、その時は時間の間隔に入らなければなりません。必要な精度を得るには、割り当てられた時間に通知をオフに解雇されますと、あなたのアプリがウェブアプリとしてそれを展開し、ウェブフックとしてそのURLを使用することにより、これらの通知を受信して​​いる外部サービスを使用する必要があります。複雑なもの。 –

答えて

0

私はあなたが.timebased('7:00');を使用することができるとは思わない、あなたが新しいものを作成するので、私はこれをしたいしようとする前に、トリガーを持っていないことを確認するために良いです。たとえば、7時のように特定の時間にトリガーを設定するように指定することができます。トリガーは7〜8の間でランダムに選択されます。それは10または11のいずれかでなければなりません。さらに精度を上げたい場合は、毎日トリガーをトリガーしてから5分トリガーを数えて、マークに近づける必要があります。あなたは、毎日のトリガが最初にどこに置かれているのかを待つ必要があります。設定されると、変更されません。

私は実際に私は私の希望の時間に十分に閉じてから、私は他人の電源を切って、その1を維持するものを取得するまで、新しいものを作成することで、ログに毎日タイマーで周りにプレイしました。あなたは忍耐しなければなりません。あなたがidのトリガーを関数名でログに入れば、その関数を変更してタイマーを続けることができます。

私は一般に、ログファイルをドライブノートパッドで作成し、ログを表示するたびに開くようにしました。

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; 
} 
関連する問題