在谷歌电子表格中设置背景颜色时的权限问题

时间:2013-02-01 21:16:00

标签: google-apps-script google-sheets

我在Google文档中有一个脚本,如果“状态”列包含特定值,则会设置行的背景颜色。问题是工作表具有某些受保护的列,因此当受限制的用户触发其部分上的脚本时,它会运行,但是它们会收到令人讨厌的权限错误消息(因为脚本会为受保护列的部分设置颜色)。因此,我需要创建2个脚本,用于对行中的行进行着色,以便当受限用户触发个性化状态消息时,只有未受保护的列会着色。这是为整行着色的代码(由可安装的onedit触发器触发):

function setBackLogColor() {

 var range = SpreadsheetApp.getActiveSheet().getDataRange();
 var statusColumnOffset = getStatusColumnOffset();

for (var i = range.getRow(); i < range.getLastRow(); i++) { 
 rowRange = range.offset(i, 0, 1);
 status = rowRange.offset(0, statusColumnOffset).getValue();

if (status == 'TO LD') 
{
  rowRange.setBackgroundColor("#cfe2f3");
} 
else if (status == 'TO GB' ) 
{
  rowRange.setBackgroundColor("#d9ead3");
} 
else if (status == 'TO OUTSIDE PARTY - WILL COME BACK' ) 
{
  rowRange.setBackgroundColor("#f4cccc");
} 
 else if (status == 'Hand Delivery 2' ) 
{
  rowRange.setBackgroundColor("#d9ead3");
} 
 else if (status == 'Hand Delivery' ) 
{
  rowRange.setBackgroundColor("#cfe2f3");
} 
else 
{
  rowRange.setBackgroundColor("#FFFFFF");
}
 }
}

//Returns the offset value of the column titled "Status"
//(eg, if the 7th column is labeled "Status", this function returns 6)
function getStatusColumnOffset() {
lastColumn = SpreadsheetApp.getActiveSheet().getLastColumn();
var range = SpreadsheetApp.getActiveSheet().getRange(1,1,1,lastColumn);

for (var i = 0; i < range.getLastColumn(); i++) {
if (range.offset(0, i, 1, 1).getValue() == "Status") {
  return i;
}  
}
}

任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

这将是Try..Catch block的良好应用。

var statusColor = "#FFFFFF"; // default value
switch (status) {
  case 'TO LD':
  case 'Hand Delivery':
    statusColor = "#cfe2f3";
    break;
  case 'TO GB':
  case 'Hand Delivery 2':
    statusColor = "#d9ead3";
    break;
  case 'TO OUTSIDE PARTY - WILL COME BACK':
    statusColor = "#f4cccc";
    break;
  default:
    // do nothing, default already set
    break;
}

try {
  // try coloring whole range
  // If non-privileged user, this will throw an exception.
  rowRange.setBackgroundColor(statusColor);
}
catch (err) {
  // You could validate that the error is indeed a permission error.
  // Let's assume that's the case, and color only the unprotected columns.
  var unprotRowRange = someSubsetOf(rowRange);  // <<<<< Adjust as needed.
  unprotRowRange.setBackgroundColor(statusColor);
}