[英]Google Sheets Countif function does not highlight the whole row
[英]How to set timer for a row in google sheets
我想為谷歌表格中的整行設置一個計時器,用戶只能在開始第一行后的一段時間后開始在第二行中輸入數據。
示例:如果用戶開始填充第 1 行的單元格,那么他們應該只能在計時器結束后才能在第二行填充數據。
誰能建議我如何開始或建議我為此使用 chrome 擴展程序?
您還可以建議我如何構建 chrome 擴展,我可以和我的同事一起嘗試。
此 function 使用 onEdit 觸發器在編輯行之間施加 20 秒的延遲。 這可能不是您想要的,但也許這是一個開始。 它使用 PropertiesService 來保存 state。 我認為用戶屬性會是更好的選擇,但腳本屬性更容易開發,因為您可以直接在腳本編輯器中修改它們。
function onEdit(e) {
const sh=e.range.getSheet();
const delay=20000;
let ms=Number(new Date().valueOf()).toFixed();
if(sh.getName()=='Sheet10') {
const ps=PropertiesService.getScriptProperties();
let dObj=ps.getProperties();
if(dObj.hasOwnProperty('row') && dObj.hasOwnProperty('delay')) {
if(dObj.row!=e.range.rowStart && Number(ms-dObj.delay)<delay) {
e.range.setValue(e.oldValue);
e.source.toast('Sorry you have ' + (delay-Number(ms-dObj.delay))/1000 + ' seconds left.');
}else{
ps.setProperties({'row':e.range.rowStart,'delay':ms});
}
}else{
ps.setProperties({'row':e.range.rowStart,'delay':ms});
}
}
}
Class 保護通常用於保護范圍不被編輯。 但是,它不適合您的情況,因為如此處所指定,正在執行腳本的用戶無法將自己從編輯器列表中刪除:
電子表格的所有者和當前用戶都不能被刪除。
因此,go 的最佳方法是使用來自onEdit 事件 object的參數oldValue
。
每次用戶編輯單元格時都會運行onEdit
觸發器。 在其中,您可以使用:
isNotFirstTime
),以及(2)最后一次編輯第一行的時間( startTime
)。您可以按照以下方式進行操作(查看評論):
function onEdit(e) {
var current = new Date(); // Current date
var range = e.range;
var editedRow = range.getRow();
var sheet = range.getSheet();
var props = PropertiesService.getScriptProperties();
var waitingTime = 20 * 1000; // 20 seconds
var isNotFirstTime = props.getProperty("isNotFirstTime"); // Check if first row was previously edited
var startTime = new Date(props.getProperty("startTime")); // Time when first row was first edited
if (editedRow === 1 && !isNotFirstTime) { // Check that (1) edited row is first one, (2) it was not edited before
props.setProperty("startTime", current.toString()); // If it's first time first row was edited, store current time
Utilities.sleep(waitingTime); // Wait for 20 seconds
props.setProperty("isNotFirstTime", true); // Store: first row was previously edited
}
// Check that (1) second row edited, (2) Less than 20 seconds passed since first time first row was edited:
if (editedRow === 2 && (current - startTime) < waitingTime) {
range.setValue(e.oldValue || ""); // Set previous value to edited cell (this avoids editing cells)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.