如何将编辑器添加到特定选项卡的整个工作表保护中?

纳布努布

我正在尝试找到我现在手动执行的操作的替代方法,这非常令人筋疲力尽(109 个电子表格,每个电子表格包含许多选项卡),那就是允许编辑特定编辑器的特定选项卡(整个电子表格与他们一起共享)使用脚本。

我有一个带有选项卡 (A,B,C,D,....) 的电子表格,这些选项卡包含许多受保护的范围(例如 A!1:2),除了我自己之外的所有人都应该受到保护。但是,每个选项卡还有一个(整个)工作表保护,我将在其中选择(手动)允许在该选项卡内进行编辑的用户(这是我在此处找到的一个技巧,以防止同一电子表格的许多编辑者能够编辑受保护的选项卡)。

电子表格演示

使用脚本:是否有可能有一个工作表设置,我将按特定顺序输入当前编辑器的电子邮件(例如,包含选项卡名称的列,旁边是被允许的人的电子邮件)编辑它们)?

添加了以下脚本

function SetProtection() {

var ss = SpreadsheetApp.getActive();
  //removes sheet protection
var protections = ss.getProtections(SpreadsheetApp.ProtectionType.SHEET);
for (var i = 0; i < protections.length; i++) {
var protection = protections[i];
if (protection.canEdit()) {
 protection.remove();
}
}

var sh7 = ss.getSheetByName("Sheet1");
var protection = sh7.protect().setDescription('Whole Sheet Protected');  
//protects whole sheet
protection.addEditors(['[email protected]']); 
  }

非常感谢

纳布努布

在很多帮助下,我得到了它的正常工作,这是主要代码:

特别感谢 RENO BLAIR 的巨大帮助,以及其他任何试图提供帮助的人 (@Tanaike ++)

我分享了代码,也许对某些人有用:

笔记:

  • 一旦您编辑 Setup_Protection 表,脚本就会触发
  • 如果您没有在设置表中提及某些选项卡,默认情况下它们将受到保护
  • 如果您列出它们,但将旁边的单元格留在没有电子邮件的情况下,脚本将开始运行并在未提及电子邮件的选项卡处停止。

代码.gs

var environment = {
protectionConfigSheetName: "Setup_Protection",
};

// Script fires when the Setup_Protection SHEET is edited

function onEdit(e) {
if (e.range.getSheet().getName() === environment.protectionConfigSheetName) resetSpreadsheetProtections();
}



function removeSpreadsheetProtections(spreadsheet) {
    [
        SpreadsheetApp.ProtectionType.SHEET,
                                           //SpreadsheetApp.ProtectionType.RANGE,   // I don't want to remove the Range Protections that I will set up in each tab
    ].forEach(function (type) {
        return spreadsheet.getProtections(type).forEach(function (protection) { return protection.remove(); });
    });
}

  function getProtectionConfig(spreadsheet) {

      var protectionConfigSheetName = "Setup_Protection";
      var sheet = spreadsheet.getSheetByName(environment.protectionConfigSheetName); 

      var values = sheet.getDataRange().getValues();
      var protectionConfig = values
          .slice(1)
          .reduce(function (protectionConfig, _a) {
          var targetSheetName = _a[0], emailAddress = _a[1];
          var config = protectionConfig.find(function (_a) {
              var sheetName = _a.sheetName;
              return sheetName === targetSheetName;
          });
          var editors = emailAddress.split(",");
          if (config)
              config.editors = config.editors.concat(editors);
          else
              protectionConfig.push({
                  sheetName: targetSheetName,
                  editors: editors.slice()
              });
          return protectionConfig;
      }, []);
      return protectionConfig;
  }


function setSpreadsheetProtections(spreadsheet, protectionConfig) {
    spreadsheet.getSheets().forEach(function (sheet) {
        var protection = sheet.protect();
        protection.removeEditors(protection.getEditors().map(function(editor) {
            return editor.getEmail();
        }));
        var currentSheetName = sheet.getName();
        var config = protectionConfig.find(function (_a) {
            var sheetName = _a.sheetName;
            return sheetName === currentSheetName;
        });
        if (config)
            protection.addEditors(config.editors);
    });
}
  function resetSpreadsheetProtections() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var protectionConfig = getProtectionConfig(spreadsheet);
  removeSpreadsheetProtections(spreadsheet);
  setSpreadsheetProtections(spreadsheet, protectionConfig);
  }

还有另一个名为 Polyfill 的文件(也是需要的):

Polyfill.gs

// https://tc39.github.io/ecma262/#sec-array.prototype.find
if (!Array.prototype.find) {
  Object.defineProperty(Array.prototype, "find", {
    value: function(predicate) {
      // 1. Let O be ? ToObject(this value).
      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }

      var o = Object(this);

      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;

      // 3. If IsCallable(predicate) is false, throw a TypeError exception.
      if (typeof predicate !== "function") {
        throw new TypeError("predicate must be a function");
      }

      // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
      var thisArg = arguments[1];

      // 5. Let k be 0.
      var k = 0;

      // 6. Repeat, while k < len
      while (k < len) {
        // a. Let Pk be ! ToString(k).
        // b. Let kValue be ? Get(O, Pk).
        // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
        // d. If testResult is true, return kValue.
        var kValue = o[k];
        if (predicate.call(thisArg, kValue, k, o)) {
          return kValue;
        }
        // e. Increase k by 1.
        k++;
      }

      // 7. Return undefined.
      return undefined;
    },
    configurable: true,
    writable: true,
  });
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将 PyQt4 中的选项卡添加到我的文本编辑器?

来自分类Dev

如何将选项卡添加到ActionBar中以进行滑动选项卡?

来自分类Dev

如何将工作空间(选项卡组)添加到PhpStorm?

来自分类Dev

R Shiny:如何将数据表添加到动态创建的选项卡

来自分类Dev

如何将列添加到选项卡中?CSS、HTML

来自分类Dev

如何将主视图控制器添加到不是选项卡栏项目之一的选项卡栏控制器?

来自分类Dev

如何在编辑器的文本选项卡中添加简码?

来自分类Dev

如何将多个选项卡关闭事件处理程序添加到 JavaFX 选项卡?

来自分类Dev

将选项卡添加到特定列

来自分类Dev

如何将 xtype 作为项目添加到 Extjs tabpanel 中动态创建的选项卡

来自分类Dev

在 Bootstrap 4 的滑块导航中,如何将“活动”类添加到当前选项卡?

来自分类Dev

Angular-UI选项卡:将类添加到特定选项卡

来自分类Dev

如何将面板添加到Extjs选项卡

来自分类Dev

如何将“音频/视频属性”选项卡添加到Caja?

来自分类Dev

如何将选项卡控件添加到RichTextBox?

来自分类Dev

如何将图标添加到我的选项卡布局活动

来自分类Dev

如何将活动状态添加到选项卡

来自分类Dev

如何将一些已知对象添加到ace编辑器语法检查器中?

来自分类Dev

将日期选择器日历添加到 tiddlywiki 5 中的右侧选项卡

来自分类Dev

如何将所需的编辑器添加到“更新替代”交互式菜单中?

来自分类Dev

如何将Markdown编辑器添加到自定义django注释?

来自分类Dev

如何将HTML编辑器添加到Eclipse?

来自分类Dev

如何将Markdown编辑器添加到自定义django注释?

来自分类Dev

Joomla 3.3.3 | 如何将样式类添加到tinymce编辑器

来自分类Dev

如何将编辑器(MPart)添加到向导/向导页面?

来自分类Dev

如何将卡从“待处理”选项卡添加到“已批准”?Vue.js

来自分类Dev

将ACE编辑器嵌入选项卡

来自分类Dev

如何将GRUB密码保护添加到OS加载过程中,而不是在编辑引导选项时添加

来自分类Dev

如何将GRUB密码保护添加到OS加载过程中,而不是在编辑启动选项时添加

Related 相关文章

  1. 1

    如何将 PyQt4 中的选项卡添加到我的文本编辑器?

  2. 2

    如何将选项卡添加到ActionBar中以进行滑动选项卡?

  3. 3

    如何将工作空间(选项卡组)添加到PhpStorm?

  4. 4

    R Shiny:如何将数据表添加到动态创建的选项卡

  5. 5

    如何将列添加到选项卡中?CSS、HTML

  6. 6

    如何将主视图控制器添加到不是选项卡栏项目之一的选项卡栏控制器?

  7. 7

    如何在编辑器的文本选项卡中添加简码?

  8. 8

    如何将多个选项卡关闭事件处理程序添加到 JavaFX 选项卡?

  9. 9

    将选项卡添加到特定列

  10. 10

    如何将 xtype 作为项目添加到 Extjs tabpanel 中动态创建的选项卡

  11. 11

    在 Bootstrap 4 的滑块导航中,如何将“活动”类添加到当前选项卡?

  12. 12

    Angular-UI选项卡:将类添加到特定选项卡

  13. 13

    如何将面板添加到Extjs选项卡

  14. 14

    如何将“音频/视频属性”选项卡添加到Caja?

  15. 15

    如何将选项卡控件添加到RichTextBox?

  16. 16

    如何将图标添加到我的选项卡布局活动

  17. 17

    如何将活动状态添加到选项卡

  18. 18

    如何将一些已知对象添加到ace编辑器语法检查器中?

  19. 19

    将日期选择器日历添加到 tiddlywiki 5 中的右侧选项卡

  20. 20

    如何将所需的编辑器添加到“更新替代”交互式菜单中?

  21. 21

    如何将Markdown编辑器添加到自定义django注释?

  22. 22

    如何将HTML编辑器添加到Eclipse?

  23. 23

    如何将Markdown编辑器添加到自定义django注释?

  24. 24

    Joomla 3.3.3 | 如何将样式类添加到tinymce编辑器

  25. 25

    如何将编辑器(MPart)添加到向导/向导页面?

  26. 26

    如何将卡从“待处理”选项卡添加到“已批准”?Vue.js

  27. 27

    将ACE编辑器嵌入选项卡

  28. 28

    如何将GRUB密码保护添加到OS加载过程中,而不是在编辑引导选项时添加

  29. 29

    如何将GRUB密码保护添加到OS加载过程中,而不是在编辑启动选项时添加

热门标签

归档