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

时间:2015-02-16 09:25:52

标签: google-apps-script google-sheets google-spreadsheet-api

使用案例 - 我已与十几位朋友分享了Google电子表格,我们正在输入我们对比赛的预测。捕获是在游戏开始之前输入它。 使用电子表格,每个人都可以看到每个人的预测。

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

3 个答案:

答案 0 :(得分:0)

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

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

function protectRangeAtMidnight() {
  //My code will go here
}

在脚本编辑器中,单击“资源”菜单,然后选择“CURRENT PROJECTS TRIGGERS”。

Trigger as Specific Time

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

问题是,代码要做什么?如果您保护范围,但与您共享电子表格的人具有编辑权限,则他们可能只是不受保护范围。如果您仅将其权限更改为VIEW,则必须在某个时刻将其更改为下一个游戏。只要可能存在其他人无法编辑工作表的时间段,那就可以工作。

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

Remove Editor

function protectRangeAtMidnight() {
  SpreadsheetApp.openById('The SS ID').removeEditor(emailAddress);

}

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

setSharing(accessType, permissionType)

答案 1 :(得分:0)

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

这是我用于预测的布局: Google sheet cropped image example

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

=if(isnumber(C1),and(now()<$A1,C1>=0,C1-int(C1)=0))

它检查C1中输入的是数字。如果是,它将检查以下内容:

  1. 如果当前日期和时间在“开始”之前。
  2. 如果该数字大于或等于零。
  3. 那是整数。

如果是,则允许更改单元格。如果比赛开始,则该单元格无法更改,并且该单元格中将出现一个红色三角形(因为违反了数据验证,因为now()将在相关日期之后),但是它阻止更改单元格游戏开始后。

如果您将以上各项与锁定整个工作表(蓝色单元格除外)结合使用,则应该允许用户在开始之前进行预测。

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

希望这会有所帮助!

答案 2 :(得分:0)

有效的方法是:

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

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

  • 工作表名称(在我的示例中是Sheet1,Sheet2)

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

    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();
  }
}
};