Google Sheets - 运行 具有 Sheet 保护的脚本

Google Sheets - Run script with Sheet Protection

我的 google sheet 有问题。在所有者视图上一切正常,但是当我尝试将其共享给编辑器时,某些功能并没有按我的计划进行。作为所有者,我使用受保护的 sheets 和范围功能。所以,我使用了protect sheet,然后except certain cells功能,这样编辑就可以在那个范围内进行编辑了。我放了两个按钮来隐藏(对于空行)和显示行。该脚本在所有者视图上运行良好,但当我将其打开到编辑器视图时,出现错误消息“异常:您正在尝试编辑受保护的单元格或对象。请联系 spreadsheet 如果您需要编辑,所有者可以取消保护。”。除了某些单元格内的范围仅在 F 列中。我该怎么办?

我正在使用此代码来隐藏空行。

var startRow = 9;
var colToCheck = 2; // Column B

function shouldHideRow(ss, rowIndex, rowValue) {
  if (rowValue != '') return false;
  if (ss.getRange(startRow + rowIndex, colToCheck, 1, 1).isPartOfMerge()) return false;
  if (ss.getRange(startRow + rowIndex + 1, colToCheck, 1, 1).isPartOfMerge()) return false;
  return true;
}

function HideRows() {
  
  var ss = SpreadsheetApp.getActiveSheet();
  var numRows = ss.getLastRow();
  var elements = ss.getRange(startRow, colToCheck, numRows).getValues();
  for (var i=0; i<(numRows - startRow); i++) {
    if (shouldHideRow(ss, i, elements[i][0])) {
      ss.hideRows(startRow + i);
    }
  }
  // Hide the rest of the rows
  var totalNumRows = ss.getMaxRows();
  if (totalNumRows > numRows)
    ss.hideRows(numRows+1, totalNumRows - numRows);
}

这是样本分布sheet:LINK

我希望有人能帮助我。提前致谢!

我相信你的目标如下。

  • 在您的 Spreadsheet 中,使用了受保护的 sheet 和范围。
  • 您想 运行 您的脚本,当用户不是 运行 脚本的所有者时。
    • 在您当前的问题中,当用户运行执行脚本时,保护范围发生错误。

修改点:

我认为解决您的问题的方法总是运行脚本作为所有者。为此,在这种情况下,我想建议使用 Web Apps。在这种情况下,我认为这可能与的情况相同。但是从你的脚本来看,我认为将线索反映到你的脚本中作为方法可能有点困难。所以我想提出修改后的脚本作为答案。

在此答案中,为了运行脚本作为 Spreadsheet 的所有者,使用了 Web 应用程序。

用法:

首先,请从您共享的 Spreadsheet.

中删除包含 doGet 的 GAS 项目

1。准备脚本。

请将以下脚本复制并粘贴到脚本编辑器中并保存。

function doGet(e) {
  this[e.parameter.run](e.parameter.sheetName || null);
  return ContentService.createTextOutput();
}

function HideRows() {
  const activeSheet = SpreadsheetApp.getActiveSheet();
  const url = ScriptApp.getService().getUrl();
  UrlFetchApp.fetch(url + "?run=script_HideRows&sheetName=" + activeSheet.getSheetName(), {headers: {authorization: "Bearer " + ScriptApp.getOAuthToken()}});

// DriveApp.getFiles()  // This is used for automatically detecting the scope of "https://www.googleapis.com/auth/drive.readonly". This scope is used for the access token.
}

function showRows() {
  const url = ScriptApp.getService().getUrl();
  UrlFetchApp.fetch(url + "?run=script_showRows", {headers: {authorization: "Bearer " + ScriptApp.getOAuthToken()}});
}

var startRow = 6;
var colToCheck = 2; // Column L

// This script is the same with your "HideRows".
function script_HideRows(sheetName) {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  var numRows = ss.getLastRow();
  var elements = ss.getRange(startRow, colToCheck, numRows).getValues();
 
  for (var i=0; i<(numRows - startRow); i++) {
    if (shouldHideRow(ss, i, elements[i][0])) {
      ss.hideRows(startRow + i);
    }
  }
  // Hide the rest of the rows
  var totalNumRows = ss.getMaxRows();
  if (totalNumRows > numRows)
    ss.hideRows(numRows+1, totalNumRows - numRows);
};

// This script is the same with your "showRows".
function script_showRows() {
  // set up spreadsheet and sheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
//  var ss = SpreadsheetApp.getActiveSpreadsheet(),
  var sheets = ss.getSheets();

  for(var i = 0, iLen = sheets.length; i < iLen; i++) {
    // get sheet
    var sh = sheets[i];

    // unhide columns
    var rCols = sh.getRange("1:1");
    sh.unhideColumn(rCols);

    // unhide rows
    var rRows = sh.getRange("A:A");
    sh.unhideRow(rRows);
  }
};

function shouldHideRow(ss, rowIndex, rowValue) {
  if (rowValue != '') return false;
  if (ss.getRange(startRow + rowIndex, colToCheck, 1, 1).isPartOfMerge()) return false;
  if (ss.getRange(startRow + rowIndex + 1, colToCheck, 1, 1).isPartOfMerge()) return false;
  return true;
}

2。部署 Web 应用程序。

  1. 在脚本编辑器上,通过“发布”->“部署为网络应用程序”打开一个对话框。
  2. Select “Me” for “执行应用程序:”
    • 至此,脚本运行作为所有者。
  3. Select “任何人” “有权访问该应用程序的人:”
    • 在这种情况下,需要访问令牌才能向 Web 应用程序发出请求。
  4. 点击“部署”按钮作为新的“项目版本”。
  5. 自动打开“需要授权”的对话框。
    1. 点击“查看权限”。
    2. Select自己的账户。
    3. 点击“此应用未验证”处的“高级”。
    4. 点击“转到###项目名称###(不安全)”
    5. 单击“允许”按钮。
  6. 点击“确定”。

3。测试此解决方法。

请单击分配有 HIDE ROWSSHOW ROWS 的按钮。至此,脚本被所有者运行。这样,即使用户点击按钮,脚本的结果也与所有者运行相同。

注:

  • 请在启用 V8 的情况下使用此脚本。

参考文献: