Объекты событий Хотя вы решили использовать триггер onEdit
, вы не использовали ни один из объектов событий, автоматически сгенерированных onEdit()
.Это позволило бы вам упростить код и создать окончательный оператор IF
, чтобы проверить, было ли введено «Y» в правильном столбце, строке и листе.
Разработка кода Выочевидно, пересмотрели ваши цели по мере разработки вашего кода;включая (в конце концов) ненужные шаги для удаления, вставки и добавления строк.Это привело к усложнению вашего кода, например, к трем идентичным переменным, созданным для sheet4.getRange("A:A").getValues();
Передача значений массива Вы выбрали правильную стратегию для обновления «Лист5», когда началивставьте значения во временный массив.В этом ответе я создал два вложенных цикла для построения необходимых значений.Первый цикл за 53 недели, а второй за 7 дней, поэтому массив создается еженедельно за 53 недели.
Код, описанный в этом ответе, является всего лишь одним из подходов.Вероятно, есть и другие способы для достижения вашей цели.Я также оставил в коде несколько операторов Logger.log()
;Вы можете использовать эти идентифицирующие значения на разных этапах функции.
function onEdit(e) {
// so 56930421_04
var ss = SpreadsheetApp.getActiveSpreadsheet();
var ui = SpreadsheetApp.getUi();
var mastername = "Sheet4";
var master = ss.getSheetByName(mastername);
var hols = ss.getSheetByName('Sheet5');
// get the range for Master and the data also
var masterLR = master.getLastRow();
var masterRange = master.getRange(4,2,masterLR-3,8);
//Logger.log("DEBUG: MASTER range = "+masterRange.getA1Notation());
var masterData = masterRange.getValues();
// get the last Column for hols for use in setting the update range
var holsLC = hols.getLastColumn();
// Logger.log("DEBUG: the last column on Hols = "+holsLC);
// display event objects - two mwthods displayed here
// Method#1
// Logger.log(JSON.stringify(e))
// Method#2
// var debug_e = {authMode: e.authMode,range: e.range.getA1Notation(),source: e.source.getId(),user: e.user,value: e.value,oldValue: e. oldValue};
// Logger.log("DEBUG: AuthMode: "+debug_e.authMode+", Range: "+debug_e.range+", source: "+debug_e.source+", user: "+debug_e.user+", value: "+debug_e.value+", old value: "+debug_e.oldValue);
// get the column, row and sheet name of the edited cell
var editColumn = e.range.getColumn();
var editRow = e.range.getRow();
var editSheet = e.range.getSheet().getSheetName();
//Logger.log("DEBUG: editted Column = "+editColumn+", editted Row = "+editRow+", edited Sheet = "+editSheet);
// set variable
var firstdatarow = 4;
// create if statement
// iF the edited row is between firstdatarow and the last row
// AND
// IF the edited column is Column#1 (Column A)
// AND
// IF the edited sheet is Master
if (firstdatarow < editRow && editRow < masterLR && editColumn == 1 && e.value == "Y" && editSheet == mastername) {
// do something
// Logger.log("DEBUG: do something");
// get the employee name
var empname = masterData[(+editRow-4)][0];
//Logger.log("DEBUG: The employee name is "+empname);
// create an alert to confirm
var result = ui.alert(
'WARNING!! You are about to Update the holiday record for '+empname,
'Are you sure you want to continue?',
ui.ButtonSet.YES_NO);
// Process the user's response.
if (result == ui.Button.YES) {
// User clicked "Yes".
ui.alert('Confirmation received.');
// build the data to be pasted to Sheet5
var holsData = [];
for (var i = 1; i<54;i++){
for (var x = 1; x<8;x++){
holsData.push(masterData[(+editRow-1)][x]);
}
//Logger.log("DEBUG: hols = "+holsData+", length = "+holsData.length);
}
//Logger.log("DEBUG: Progressive holsData = "+holsData+", length = "+holsData.length);
// create the range for Sheet5
var target = hols.getRange(editRow,2,1,(+holsLC-1));
//Logger.log("DEBUG: the target range = "+target.getA1Notation());
// update the values to Sheet5
target.setValues([holsData]);
//Removes "Y" to stop code repeating
master.getRange(editRow,editColumn).clearContent();
} else {
// User clicked "No" or X in the title bar.
ui.alert('Permission denied.');
//Removes "Y" to stop code repeating
master.getRange(editRow,editColumn).clearContent();
}
}
else
{
// don't do anything
Logger.log("don't do anything");
}
}