google-apps-script - 谷歌工作表的保护脚本问题 - 无法读取未定义的属性 'getRange'

标签 google-apps-script google-sheets

脚本总结:

  • 脚本应该循环工作表保护和范围保护并找到目标工作表和目标范围。
  • 然后,检查当前用户是否具有编辑者的权限。
  • 如果不是 - 脚本检查对目标工作表和目标范围具有编辑权限的用户数量是否小于允许的用户电子邮件列表中的数量。
  • 如果是这样 - 脚本会从目标工作表和目标范围中删除所有权限,并将它们重新设置为允许的用户电子邮件列表。

  • 我的问题:我收到此错误:

    TypeError: Cannot read property 'getRange' of undefined at [the getRange properties of both while loops conditions]



    脚本:
    function someFunction() {
      var ss = SpreadsheetApp.getActive();
      var sheetName = 'some sheet name';
      var rangeName = 'some range name';
      var targetSheet = ss.getSheetByName(sheetName);
      var targetRange = ss.getRangeByName(rangeName);
      // set permissions
      var permittedUserEmails = ['user1@gmail.com','user2@gmail.com','user3@gmail.com','user4@gmail.com','user5@gmail.com'];
      var sheetProtections = ss.getProtections(SpreadsheetApp.ProtectionType.SHEET);
      var rangeProtections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
      var i = 0;
      while (sheetProtections[i].getRange().getSheet() != targetSheet {
        i++;
      }
      if (sheetProtections[i].canEdit() == false) {
        if (rangeProtections[i].getEditors().length < permittedUserEmails.length) {
          sheetProtections[i].remove();
          sheetProtections[i].addEditors(permittedUserEmails);
        }
      }
      var j = 0;
      while (rangeProtections[j].getRange() != targetRange {
        j++;
      }
      if (rangeProtections[j].canEdit() == false) {
        if (rangeProtections[j].getEditors().length < permittedUserEmails.length) {
          rangeProtections[j].remove();
          rangeProtections[j].addEditors(permittedUserEmails);
        }
      }
    }
    

    注:
  • 如果我使用 Browser.msgBox(sheetProtections[i].getRange())Browser.msgBox(rangeProtections[j].getRange())就在相应的 while 之前循环 I 不要得到一个错误。
  • user1@gmail.com 是 ss 所有者。

  • 有人可以解释一下发生了什么以及如何解决这个问题吗?

    更新:
    错误是由 i 引起的和 j超出sheetProtectionsrangeProtections长度,相应地不满足循环条件。

    指示目标表和范围的不同方法解决了该问题。

    最佳答案

    发生错误是因为没有找到该名称的工作表或范围保护。getProtections如果没有找到保护,方法返回一个空数组。如果没有保护,它不会返回 undefined 或 null。如果没有找到保护,它返回一个空数组的真值。这意味着空数组的长度为零。您正在开始计算变量 i在零处,这是一个有效的索引,并且不会在 sheetProtections[i] 处返回错误即使索引零处的值未定义。

    有多种方法可以处理这种情况,下面是一种可能性。

    function someFunction() {
    
    
      var ss = SpreadsheetApp.openById('1RwwWliVHscvvRLOZ4jTQNtQJOgoTSBAo43VRDMhKzoo');
    
      var sheetName = 'some';
      var rangeName = 'some';
      var targetSheet = ss.getSheetByName(sheetName);
      var targetRange = ss.getRangeByName(rangeName);
      // set permissions
      var permittedUserEmails = ['user1@gmail.com','user2@gmail.com','user3@gmail.com','user4@gmail.com','user5@gmail.com'];
    
      var sheetProtections = ss.getProtections(SpreadsheetApp.ProtectionType.SHEET);
      var rangeProtections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
    
      Logger.log('sheetProtections: ' + sheetProtections)
    
      var L = sheetProtections.length;
      Logger.log("L: " + L)
      var i = 0;
    
      while (i < L) {//If i reaches the L number then it stops - If L is zero and i is zero then zero is not less than zero
        Logger.log('i ' + i)
        if (sheetProtections[i].getRange().getSheet() === targetSheet;) {
          break;
        }
    
        i++;//decrement
      }
    
      if (sheetProtections[i].canEdit() == false) {
        if (rangeProtections[i].getEditors().length < permittedUserEmails.length) {
          sheetProtections[i].remove();
          sheetProtections[i].addEditors(permittedUserEmails);
        }
      }
    
      L =  rangeProtections.length;
    
      var j = 0;
    
      while (j < L) {
        if (rangeProtections[j].getRange() === targetRange) {
          break;
        }
        j++;
      }
    
      if (rangeProtections[j].canEdit() == false) {
        if (rangeProtections[j].getEditors().length < permittedUserEmails.length) {
          rangeProtections[j].remove();
          rangeProtections[j].addEditors(permittedUserEmails);
        }
      }
    }
    

    关于google-apps-script - 谷歌工作表的保护脚本问题 - 无法读取未定义的属性 'getRange',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62112801/

    相关文章:

    google-sheets - Google 电子表格公式在函数中使用当前行

    pdf - 在Apps脚本中将单页导出为PDF

    javascript - 无法根据 Google 电子表格中的日期过滤主表中粘贴的其他电子表格中的数据

    javascript - 外部 API 数据 ---> HTML 服务输出为图表/表格

    google-apps-script - 如何使用 Google UI Builder 和 Apps 脚本的清晰示例

    javascript - Google App Script 声明中的超链接已删除

    google-apps-script - 清除第二天表单条目上的脚本错误

    google-apps-script - Google Apps 脚本 - 如何将一列复制到下一个可用列的另一工作表

    google-apps-script - Google 表单更新响应选项而不是创建新行

    java - 获取和更新单个谷歌工作表中的单元格(电子表格中的特定工作表)