Google apps script 如何在谷歌电子表格中的特定时间后禁用编辑单元格?

Google apps script 如何在谷歌电子表格中的特定时间后禁用编辑单元格?,google-apps-script,google-sheets,google-spreadsheet-api,Google Apps Script,Google Sheets,Google Spreadsheet Api,用例-我在十几个朋友中分享了一个谷歌电子表格,我们正在输入我们对比赛的预测。接球是在比赛开始前进入。 使用电子表格,因为每个人都可以看到每个人的预测 问题-是否有插件或任何功能允许在特定时间后禁用编辑几个单元格?假设午夜后[7]-M[7]单元格无法编辑。您可以设置脚本在特定时间运行: 在脚本编辑器中,创建一个函数: function protectRangeAtMidnight() { //My code will go here } 在脚本编辑器中,单击“资源”菜单,然后选择“当前项目触

用例-我在十几个朋友中分享了一个谷歌电子表格,我们正在输入我们对比赛的预测。接球是在比赛开始前进入。 使用电子表格,因为每个人都可以看到每个人的预测


问题-是否有插件或任何功能允许在特定时间后禁用编辑几个单元格?假设午夜后[7]-M[7]单元格无法编辑。

您可以设置脚本在特定时间运行:

在脚本编辑器中,创建一个函数:

function protectRangeAtMidnight() {
  //My code will go here
}
在脚本编辑器中,单击“资源”菜单,然后选择“当前项目触发器”

为特定日期和时间添加触发器

问题是,代码将做什么?如果您保护该范围,但与您共享电子表格的人具有编辑权限,则他们可以取消对该范围的保护。如果您将他们的权限更改为仅查看,那么您必须在下一个游戏的某个时候将其更改回。只要有一段时间没有其他人可以编辑工作表,这就行了

您可以从编辑器列表中删除用户:

您还可以通过DriveApp设置文件共享权限:


我实际上在做同样的事情,遇到同样的问题。我提出的解决方案不锁定单元格,而是使用数据验证。在线建议的一些解决方案似乎没有考虑到您需要锁定一行有日期关联的结果

这是我用于预测的布局:

蓝色单元格随后具有以下数据验证(标准为自定义公式,拒绝输入):

=if(isnumber(C1)和(now()=0,c1int(C1)=0))
它检查C1中输入的是一个数字。如果是,则检查以下各项:

  • 如果当前日期和时间在“启动”之前
  • 如果数字大于或等于零
  • 这是一个整数
  • 如果是,则允许更改单元格。如果比赛已经开始,单元格将无法更改,并且单元格中会出现一个红色三角形(因为数据验证将被违反,因为now()将在相关日期之后),但一旦比赛开始,它将停止更改单元格

    如果您将上述内容与锁定整个工作表(蓝色单元格除外)结合起来,则应允许用户在启动前进行预测

    如果游戏开始后需要更改单元格,可以修改A列中的日期,然后在更改回日期之前进行更新

    希望这有帮助

    有效的方法是:

    在特定时间锁定单元格或列,然后在另一个时间移除保护:使用每日触发器(甚至手动)

    运行功能前需要进行的修改:

    • 图纸名称(在我的示例中是Sheet1,Sheet2)

    • 要保护的范围(在我的示例中是A:D)(编辑器将无法编辑指定的范围)

      函数锁(){
      变量选项卡=['Sheet1','Sheet2'];
      var ss=SpreadsheetApp.getActiveSpreadsheet();
      对于(变量i=0;i
    要删除保护,您将使用以下脚本:编辑器“恢复”其编辑指定范围的权限:

    function Unlock() {
    
    var ss = SpreadsheetApp.getActive();
    var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
    for (var i = 0; i < protections.length; i++) {
      if (protections[i].getDescription() == 'Protected') {
        protections[i].remove();
      }
    }
    };
    
    函数解锁(){
    var ss=SpreadsheetApp.getActive();
    var保护=ss.getProtections(电子表格应用程序保护类型范围);
    对于(变量i=0;i<0.length;i++){
    if(保护[i].getDescription()=='Protected'){
    保护[i].remove();
    }
    }
    };
    
    那么,您建议我如何使用该代码来保护一个范围?此外,我不需要将他们的权限从“仅查看”更改回“编辑”,因为下一场游戏的预测将位于新行中。更改的权限将用于上一行。对吗?我认为您不能仅为电子表格的一部分设置编辑/查看权限。这就是问题所在。它是整个电子表格的编辑或查看。
    =if(isnumber(C1),and(now()<$A1,C1>=0,C1-int(C1)=0))
    
    function Lock() {
    
    var tabs = ['Sheet1', 'Sheet2'];
    
    var ss=SpreadsheetApp.getActiveSpreadsheet();
    for (var i = 0; i < tabs.length; i++) {
        var spreadsheet=ss.getSheetByName(tabs[i]);
    
    var protection = spreadsheet.getRange('A:D').protect();
    
    protection.setDescription('Protected')
    protection.removeEditors(protection.getEditors());
    
    }
    };
    
    function Unlock() {
    
    var ss = SpreadsheetApp.getActive();
    var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
    for (var i = 0; i < protections.length; i++) {
      if (protections[i].getDescription() == 'Protected') {
        protections[i].remove();
      }
    }
    };