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 应用程序。
- 在脚本编辑器上,通过“发布”->“部署为网络应用程序”打开一个对话框。
- Select “Me” for “执行应用程序:”。
- 至此,脚本运行作为所有者。
- Select “任何人” “有权访问该应用程序的人:”。
- 在这种情况下,需要访问令牌才能向 Web 应用程序发出请求。
- 点击“部署”按钮作为新的“项目版本”。
- 自动打开“需要授权”的对话框。
- 点击“查看权限”。
- Select自己的账户。
- 点击“此应用未验证”处的“高级”。
- 点击“转到###项目名称###(不安全)”
- 单击“允许”按钮。
- 点击“确定”。
3。测试此解决方法。
请单击分配有 HIDE ROWS
和 SHOW ROWS
的按钮。至此,脚本被所有者运行。这样,即使用户点击按钮,脚本的结果也与所有者运行相同。
注:
- 请在启用 V8 的情况下使用此脚本。
参考文献:
- Web Apps
- Taking advantage of Web Apps with Google Apps Script
- 相关问题
- How to enable not authorized users to protect the spreadsheet
我的 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 应用程序。
- 在脚本编辑器上,通过“发布”->“部署为网络应用程序”打开一个对话框。
- Select “Me” for “执行应用程序:”。
- 至此,脚本运行作为所有者。
- Select “任何人” “有权访问该应用程序的人:”。
- 在这种情况下,需要访问令牌才能向 Web 应用程序发出请求。
- 点击“部署”按钮作为新的“项目版本”。
- 自动打开“需要授权”的对话框。
- 点击“查看权限”。
- Select自己的账户。
- 点击“此应用未验证”处的“高级”。
- 点击“转到###项目名称###(不安全)”
- 单击“允许”按钮。
- 点击“确定”。
3。测试此解决方法。
请单击分配有 HIDE ROWS
和 SHOW ROWS
的按钮。至此,脚本被所有者运行。这样,即使用户点击按钮,脚本的结果也与所有者运行相同。
注:
- 请在启用 V8 的情况下使用此脚本。
参考文献:
- Web Apps
- Taking advantage of Web Apps with Google Apps Script
- 相关问题
- How to enable not authorized users to protect the spreadsheet