gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:11:11 25 4
gpt4 key购买 nike

脚本总结:

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

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

    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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com