Измените сценарий перемещения листа Google с редактирования на ручной - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь изменить сценарий 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());  
}
    }
  }

Я создал ссылки для помощи:

Календарь

Акт

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...