【问题标题】:Lock a row when cell is checked in Google Sheets在 Google 表格中选中单元格时锁定一行
【发布时间】:2021-08-22 05:05:23
【问题描述】:

我有一个 Google 表格电子表格,其中有一群朋友,每个人都在自己指定的标签上输入赌注。在他们完成 A-E 列的编辑后,他们必须选中 F 列中的框以“提交”他们的赌注。选中该框后,我想锁定该行以防止有人更改赌注。我还想将 A-F 列中的背景颜色从橙色更改为灰色,以表示提交。

https://docs.google.com/spreadsheets/d/12M1F69a_DgEW3yU154Bm6kVpi5dZ1tdJksvKzNBgJek/edit?usp=sharing

【问题讨论】:

    标签: javascript google-apps-script google-sheets


    【解决方案1】:

    我还没有检查是否可以通过这种方式锁定行。但是,以防万一,作为另一种选择或可能的解决方法,我建议将“锁定”值复制到锁定或/和隐藏的工作表上,并在每次修改电子表格时比较这些值。如果存在差异,脚本可以比较工作表并将锁定工作表中的“锁定”(提交)值复制回用户工作表。

    可能,作为一种极其防破坏的解决方案,您可以将赌注存储为脚本属性:

    https://developers.google.com/apps-script/guides/properties

    更新

    事实证明,您无法限制当前用户编辑工作表上的任何单元格:How to lock a sheet for current user with Google script

    电子表格的所有者和当前用户都不能被删除。

    有额外的“帮助”表的解决方法:https://support.google.com/docs/forum/AAAABuH1jm0gnrD6_XtZT0/?hl=en&gpf=%23!topic%2Fdocs%2FgnrD6_XtZT0

    仅出于教育目的,这是我的尝试。它通过单击复选框来更改背景(变为灰色并返回橙色),但它不保护单元格:

    function onEdit(e) {
      const col = e.range.columnStart;
      // e.source.toast(col);  // <-- to debug
      if (col != 6) return;
    
      const row = e.range.rowStart;
      // e.source.toast(row);
    
      const sheet = e.source.getActiveSheet();
      const range = sheet.getRange(row, 1, 1, 6);
      // e.source.toast(range.getValues());
    
      const value = e.range.getValue();
      // e.source.toast(value);
    
      if (!value) {
        // set orange backgrounds    <-- it works fine
        range.setBackgrounds([range.getBackgrounds()[0].map(x => x = '#fce5cd')]);
        return;
      }
    
      // set gray backgrounds    <-- it works fine
      range.setBackgrounds([range.getBackgrounds()[0].map(x => x = '#cccccc')]);
    
      const protection = range.protect();
      protection.removeEditors(protection.getEditors()); // <-- it doesn't work
      
      const user = Session.getEffectiveUser();
      // e.source.toast(user);
      protection.removeEditors(user); // <-- it doesn't work as well
     
    }
    

    【讨论】:

    • 单元格的基础值为 FALSE(),选中后变为 TRUE()。我不太了解 JS,但是如果它是 TRUE(),是否应该有一种方法来获取活动单元格的值并锁定范围(在本例中为活动行)?
    • 有问题。也许。您可以锁定某个用户(编辑器)的范围。但是什么时候应该锁定呢?只要编辑器单击复选框。因此,应该有触发函数onEdit(e) 的触发函数。但不幸的是,这个触发器无法检测到谁是用户(编辑者)——它有developers.google.com/apps-script/guides/triggers的限制。据我所知。不过,我可能是错的。这需要尝试。我手头没有现成的解决方案。这就是为什么我建议在“提交”之后将值复制到某处并改为检查副本的原因。
    • 如果有一些时间延迟也没关系,我只是不希望有人在几天后进入并在事后进行更改。我也可以将锁应用于所有人而不是特定用户,因为这似乎更容易。
    • 嗯,事实证明,您不能限制当前用户编辑工作表上的任何单元格:stackoverflow.com/questions/38624196/… 但有一种解决方法,正如我之前所说的那样:脚本创建额外的隐藏“助手”表并将“助手”表上的值与用户表上的值进行比较:support.google.com/docs/forum/AAAABuH1jm0gnrD6_XtZT0/…
    【解决方案2】:

    有一个解决方法 - 您需要将脚本注册为可安装触发器:https://developers.google.com/apps-script/guides/triggers/installable

    当需要限制用户(不是所有者)时,它会有所帮助。

    一个提示:如果您将该函数注册为可安装触发器,并且该函数是例如onEdit,并且可安装的触发器将设置为 onEdit,然后该函数将触发两次。 在这种情况下,命名您的功能,例如“myfunction”,它会被触发一次。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2015-10-15
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多