【问题标题】:Google Sheets: Exclude the current date row from protectionGoogle 表格:从保护中排除当前日期行
【发布时间】:2019-09-23 10:12:09
【问题描述】:

我在 Google 表格中有一个表格,格式为:

A B C

日期库存需求

Day2 Date2 库存需求

等等

其他人需要每天填写库存和需求。但是,他们应该只填写当天的需求和库存。他们也不允许更改以前的数据或提前填写未来几天的库存和需求。 因此,我想保护整个工作表不被其他人编辑,除了当前日期的行。例如,今天 (23.09) 他们应该能够编辑 B 为 23.09.2019 的行,仅此而已。

有人可以帮帮我吗?谢谢。

【问题讨论】:

    标签: google-sheets-api google-sheets-formula


    【解决方案1】:

    工作流程可以如下

    • 遍历所有工作表行,将 B 列中的日期与今天进行比较
    • 返回具有今天日期的行索引
    • 删除所有现有的工作表保护
    • 创建一个protection,以保护整个工作表,但包含setUnprotectedRanges 的今天日期的行除外

    示例:

    function myFunction() {
     var sheet=SpreadsheetApp.getActive().getActiveSheet();
     var range=sheet.getDataRange();
     var values=range.getValues();
     var today=new Date();
     today.setHours(0);
     today.setMinutes(0);
     today.setSeconds(0);
     today.setMilliseconds(0);
     var todayMs=today.getTime();
      for(var i=0;i<values.length;i++){
        var date=values[i][1];
        var dateMs=date.getTime();
        if(dateMs==todayMs){
          var row=i+1;
          break;
        }
      }  
      var protections=sheet.getProtections(SpreadsheetApp.ProtectionType.SHEET); 
     for (var i = 0; i < protections.length; i++) {
      var protection = protections[i];
      if (protection.canEdit()) {
        protection.remove();
       } 
     } 
     var myProtection = sheet.protect().setDescription('Sample protected range'); 
     var rangeToday=sheet.getRange(row, 1, 1, sheet.getLastColumn());
     myProtection.setUnprotectedRanges([rangeToday]);
     myProtection.removeEditors(myProtection.getEditors());
    }
    

    注意:此代码在找到包含的第一行后退出循环 今天的日期。如果您有几行具有相同的日期,您 需要修改代码,将row转换成数组,可以 包含各种条目。

    【讨论】:

    • 非常感谢您的帮助!我不确定它是否有效。我将您的代码放入宏中,但是如果我使用另一个配置文件访问该文件,则仍然可以编辑该文件。抱歉,我是 GoogleSheets 的新手,我需要添加更多吗?例如,如果我使具有链接的人可以访问该文件并且他可以编辑,那么他可以编辑所有内容。对不起,我应该更多地指定这部分。
    • 请问您是在创建宏后运行宏吗?此外,如果您想运行该功能,例如每天,您可以设置一个可安装的基于时间的触发器,而不是手动运行代码/宏,请参见此处:developers.google.com/apps-script/guides/triggers/installabledevelopers.google.com/apps-script/reference/script/…
    • 我复制了您的代码,打开了脚本编辑器并粘贴了您的代码,然后按下了播放按钮。我现在收到错误 TypeError: Funktion getTime in Objekt not found(第 28 行,文件“代码”)。但是,如果我创建一个链接,我仍然可以编辑所有内容。可能是我分享的逻辑不对?
    • 此错误表示电子表格中不包含今天的日期。问题可能源于电子表格未将您的(德语)格式识别为有效日期格式。在这种情况下,您需要根据电子表格设置调整日期格式
    • 再次感谢您!我明天会更准确地检查这是否有效。但是格式现在是通用的 DD.MM.YYYY。我尝试将其更改为美国 MM/DD/YYYY,但仍然无法正常工作。第一列 A 有德国日蒙塔格、星期二等,但这应该不是问题,因为 B 列包含足够的信息。此外,它由 A2=B2 定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2019-06-18
    • 2022-08-10
    • 2012-12-20
    相关资源
    最近更新 更多