我通過給每個學生一個谷歌表格來組織我的學生參加考試。為了設定接受和拒絕所有表單的回應的時間,我使用了一個帶有如下回圈的觸發器:
function stopFormRespones() {
var ss = SpreadsheetApp.getActive();
for (var l = 2; l <= ss.getSheetByName('listStudent').getLastRow(); l ) {
var link = ss.getSheetByName('listStudent').getRange('N' l).getValue();
var form = FormApp.openByUrl(link);
form.setAcceptingResponses(false);
}
}
function openFormRespones() {
var ss = SpreadsheetApp.getActive();
for (var l = 2; l <= ss.getSheetByName('listStudent').getLastRow(); l ) {
var link = ss.getSheetByName('listStudent').getRange('N' l).getValue();
var form = FormApp.openByUrl(link);
form.setAcceptingResponses(true);
}
}
function scheduledCollection() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var start = ss.getSheetByName('title').getRange('F12').getValue();
var end = ss.getSheetByName('title').getRange('F14').getValue();
var t = new Date();
if (t > start & t < end) {
openFormRespones();
} else {
stopFormRespones();
}
}
function StartStop() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var start = ss.getSheetByName('title').getRange('F12').getValue();
var end = ss.getSheetByName('title').getRange('F14').getValue();
var limit = ScriptApp.newTrigger('scheduledCollection')
.forSpreadsheet(ss)
.onChange()
.create();
}
但是,如果表單數量很大(超過 50 個表單),則觸發器似乎有錯誤。它不會按設定的時間執行。我認為原因是因為回圈用完了允許的時間。如何一次觸發表單(不使用回圈)?期待您的幫助。
uj5u.com熱心網友回復:
您的腳本的主要問題是它在每次 for 回圈迭代中讀取一個單元格。這是一個問題,因為
- Google Apps 腳本的執行時間限制和
- Google Apps 腳本方法很慢
解決方案是減少對 Google Apps 腳本方法的呼叫次數。這可以通過
- 在單個操作中從同一張表中讀取我們需要的所有單元格
- 使用函式引數以避免在其他函式呼叫的函式中重復操作。
- 拆分每次執行時要處理的表單數量。一種方法是
scheduledCollection通過傳遞起始行和要處理的鏈接數進行引數化,創建一個函式來設定每個集合的引數值。下面的代碼只包含 2,setOne并且setTwo,請根據需要添加任意數量。
獎金:
- 洗掉未使用的變數的變數宣告。
筆記:
避免使用 on change trigger 來呼叫 setOne、setTwo 等,因為這種觸發器會在每次電子表格更改時執行,而是使用自定義選單來一一呼叫它們,或者使用使用 HtmlService 創建的用戶界面來呼叫它們異步地,這將允許它們并行運行。
function stopFormRespones(links) {
for (var l = 0; l < links.length; l ) {
var link = links[l];
var form = FormApp.openByUrl(link);
form.setAcceptingResponses(false);
}
}
function openFormRespones(links) {
for (var l = 0; l < links.length; l ) {
var link = links[l];
var form = FormApp.openByUrl(link);
form.setAcceptingResponses(true);
}
}
function scheduledCollection(row,howMany) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
// read values in a single operation. Use deconstruction to assign values to variables
var [start, _ ,end] = ss.getSheetByName('title').getRange('F12:F14').getValues().flat();
var t = new Date();
// Read the links once
var sheet = ss.getSheetByName('listStudent');
var lastRow = sheet.getLastRow();
var links = sheet.getRange(row,14,howMany).getValues().flat();
if (t > start & t < end) {
// pass links as a function parameter
openFormRespones(links);
} else {
// pass links as a function parameter
stopFormRespones(links);
}
}
function setOne(){
var row = 1;
var howMany = 10;
scheduledCollection(row,howMany);
}
function setTwo(){
var row = 11;
var howMany = 20;
scheduledCollection(row,howMany);
}
有關的
- 由于 getValue 和單元格插入,處理時間可能較長
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/531120.html
