Я пытаюсь изменить сценарий OnEdit на сценарий, запускаемый вручную.
Скрипт Google, приведенный ниже, работает с правкой для копирования определенного диапазона данных (B: AJ) на основе "Y", помещаемого на AK в другую электронную таблицу со вставкой "BZ", с последующим перемещением исходной строки.на другой лист в той же книге.Так как он основан на редактировании, он заставляет пользователя ждать запуска сценария, прежде чем поставить «Y» в следующей строке.Я хотел бы преобразовать его в скрипт, запускаемый вручную, который использует функцию меню, которая у меня уже есть.
Сценарий OnEdit:
function myFunction(e) {
var sourceSheetName = "Bretts Calendar with Accounting";
var destinationSpreadsheetId = '1dSJOOw_oLVc6Nf-C0MY9715tZGuh69kR6-j_m8EJ-So';
var destinationSheetName = "Unprocessed Acct Data";
if (e.source.getSheetName() == sourceSheetName && e.range.getColumn() == 37 && e.value.toUpperCase() == "Y") {
var row = e.range.getRow();
var sourceValues = e.source.getRange("B" + row + ":AK" + row).getValues()[0];
var values = [sourceValues.slice(0, 35)];
values[0].unshift("BZ");
var tss = SpreadsheetApp.openById(destinationSpreadsheetId);
var ts = tss.getSheetByName(destinationSheetName);
ts.getRange(ts.getLastRow() + 1, 2, values.length, values[0].length).setValues(values);
e.range.setValue("Copied");
var destSheetName = "Reviewed Bretts Calendar with Accounting";
var destSheet = e.source.getSheetByName(destSheetName);
e.source.getActiveSheet().getRange(e.range.getRow(), 1, 1, e.source.getActiveSheet().getLastColumn()).moveTo(destSheet.getRange(destSheet.getLastRow() + 1 , 1, 1, e.source.getActiveSheet().getLastColumn()));
var destinationRange = ts.getRange("A2:AK");
destinationRange.sort([{column: 6, ascending: true}, {column: 7, ascending: true}]);
e.source.getActiveSheet().deleteRow(e.range.getRow());
}
}
Я знаю, как добавить скрипт в выпадающее меню, которое позволяет запускать его вручную, но я теряюсь, как ссылаться на какую строку (и)для сценария, чтобы захватить, поскольку он больше не редактируется, и если мне нужно зациклить сценарий, чтобы он перехватывал все строки 1 на 1, или если он имел возможность видеть все строки и обрабатывать копию, и перемещать все сразу,
function onOpen() {
var spreadsheet = SpreadsheetApp.getActive();
var menuItems = [
{name: 'Send Data', functionName: 'sendData_'},
];
spreadsheet.addMenu('Click Me', menuItems);
}
function sendData_(){
var s = SpreadsheetApp.getActive().getSheetByName('Bretts Calendar with Accounting');
var destinationSpreadsheetId = '1dSJOOw_oLVc6Nf-C0MY9715tZGuh69kR6-j_m8EJ-So';
var destinationSheetName = "Unprocessed Acct Data";
s.getRange('B:AK').getValues().forEach(function (r,i){
if (r[36] == "y" || r[36] == "Y") {
var row = e.range.getRow();
var sourceValues = e.source.getRange("B" + row + ":AK" + row).getValues()[0];
var values = [sourceValues.slice(0, 35)];
values[0].unshift("BZ");
var tss = SpreadsheetApp.openById(destinationSpreadsheetId);
var ts = tss.getSheetByName(destinationSheetName);
ts.getRange(ts.getLastRow() + 1, 2, values.length, values[0].length).setValues(values);
e.range.setValue("Copied");
var destSheetName = "Reviewed Bretts Calendar with Accounting";
var destSheet = e.source.getSheetByName(destSheetName);
e.source.getActiveSheet().getRange(e.range.getRow(), 1, 1, e.source.getActiveSheet().getLastColumn()).moveTo(destSheet.getRange(destSheet.getLastRow() + 1 , 1, 1, e.source.getActiveSheet().getLastColumn()));
var destinationRange = ts.getRange("A2:AK");
destinationRange.sort([{column: 6, ascending: true}, {column: 7, ascending: true}]);
e.source.getActiveSheet().deleteRow(e.range.getRow());
}
}
}
Я создал ссылки для помощи:
Календарь
Акт