Приведенный ниже код работает, но для его выполнения требуется много времени
var j=0;
for(var j=0;j<k;j++)
{
var cell = billsheet.getRange('M'+(billlastrow+(j+1)));
var range = contractorsheet.getRange(vrangearray[j][0]);
var rule = SpreadsheetApp.newDataValidation().requireValueInRange(range).build();
cell.setDataValidation(rule);
var prange = billsheet.getRange('E'+(billlastrow+j+1)+':P'+(billlastrow+j+1));
var protection = prange.protect();
//var me = Session.getEffectiveUser();//don't use this line
protection.removeEditors(protection.getEditors());
protection.addEditor(vrangearray[j][1]);
//Logger.log(j);
} // end for k
Я изменил код, как показано ниже
var depts = packagesheet.getRange('B1:AJ5').getValues();
var billarray=[];
var crangearray=[];
var prangearray=[];
var vrangearray=[];
var erangearray=[];
var j=0;
var k=0
for(var j=0;j<=34;j++)
{
if (depts[0][j]=="" || laborvalues[0][(j+1)]=="-") {} else {
k++
if (depts[0][j].substring(0,5)=="Extra") {var extra=1} else {var extra=0};
// ID Lot ID_Lot Customer Panel Section Dept Qty Remark Start COMPLETED, End Contractor Rate Rate2 Bill Supervisor Fed Colour Extra
billarray.push([ordervalues[0][0], lotno, ordervalues[0][0]+'/'+lotno, ordervalues[0][1], ordervalues[0][2],depts[0][j],depts[1][j],lotqty , "", today, "", "", "" ,laborvalues[0][j+1] , laborvalues[0][j+1] , "" , depts[4][j], today, color, extra]); //'=VLOOKUP($C'+(billlastrow+1)+',Completed!$C:J,8,0)'
crangearray.push([ 'M'+(billlastrow+k+1) ] ); //contractor drop down cell
prangearray.push([ 'E'+(billlastrow+k+1)+':P'+(billlastrow+k+1)]); //range to be protected
vrangearray.push([ "Contractor!"+depts[2][j] ]); //valid contractor list
erangearray.push([ depts[3][j] ]); //valid emails for giving editing rights
}//if section=""
} // end for 34
//insert full bill at once
billsheet.getRange("A"+(billlastrow+1)+":T"+(billlastrow+(billarray.length))).setValues(billarray);
//set drop down for contractors
var destinationRange = billsheet.getRange(crangearray);
var sourceRange = contractorsheet.getRange(vrangearray);
var rule = SpreadsheetApp.newDataValidation().requireValueInRange(sourceRange).build();
var rules = destinationRange.getDataValidations();
for (var i = 0; i < rules.length; i++) {
for (var j = 0; j < rules[i].length; j++) {
rules[i][j] = rule;
}
}
destinationRange.setDataValidations(rules);
//set protection for different production people
var prange = billsheet.getRange(prangearray);
var protection = prange.protect();
protection.removeEditors(protection.getEditors());
protection.addEditor(erangearray);
Выдает ошибку в строке ниже:
var destinationRange = billsheet.getRange(crangearray);
Я сделал копию таблицы:
https://docs.google.com/spreadsheets/d/1bdO6IdEcIxkCwlW2o-93jpy7BZYb8nrFDE00u-VzQ4Y/edit?usp=sharing
Любые идеи, как защитить и установить валидацию для диапазона с разными правилами для разных строк.