簡體   English   中英

如何在谷歌表格中為一行設置計時器

[英]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觸發器。 在其中,您可以使用:

  • PropertiesService來存儲有用的信息:(1)是否是第一次編輯第 1 行( isNotFirstTime ),以及(2)最后一次編輯第一行的時間( startTime )。
  • 事件 object以獲取有關已編輯單元格的信息(其行、其舊值等)。

您可以按照以下方式進行操作(查看評論):

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM