Как скопировать строку с листа и вставить несколько версий с небольшими изменениями на другой лист

У меня уникальная ситуация. Я создаю низкотехнологичную систему управления работой. У меня есть лист «Рабочие задания», в котором каждая строка после заголовка содержит рабочее задание. Однако заказы на работу могут длиться несколько дней. Итак, мне нужен отдельный лист, который показывает каждую ежедневную задачу для каждого рабочего задания. Так, например, если заказ на работу от 1/12/17 до 1/14/17, я хочу автоматизировать создание трех строк на другом листе для представления каждого дня. Цель состоит в том, чтобы иметь возможность назначать бригады для каждой повседневной задачи.

Это то, что я написал до сих пор, но признаюсь, я не уверен, в чем ошибка (-ы) и близок ли я к этому. Я точно любитель.

В этом примере лист «Word Orders» является моим исходным листом, «Schedule» - моим целевым листом, AD и AE - столбцами с начальной и конечной датой, а AI - моим условным условием, ЕСЛИ «Да» для onEdit.

function onEdit(event) {

  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var target = SpreadsheetApp.getActiveSpreadsheet()
  var source_sheet = ss.getSheetByName("Work Orders");
  var target_sheet = target.getSheetByName("Schedule");
  var source_range = source_sheet.getActiveRange().getRow();
  var startdate = source_sheet.getRange("AD"+(source_range));
  var enddate = source_sheet.getRange("AE"+(source_range));
  var duration = enddate - startdate + 1
  var event = (source_sheet.getRange("AI"+(source_range));
  var last_row = target_sheet.getLastRow();
  var target_range = target_sheet.getRange("A"+(last_row+1)+":AJ"+(last_row+1));

  if (source_sheet.getRange("AI"+(source_range)) == "Yes");
  target_sheet.insertRowAfter(last_row);
  source_range.copyTo(target_range);
  } 

Мне тоже не нужно, чтобы это был триггер onEdit (). У меня есть собственный пункт меню, который я мог бы использовать вместо него. Если бы я использовал эту опцию, мне больше не понадобилось бы условное «Да» в ИИ.

function onOpen() {

  SpreadsheetApp.getUi()
      .createMenu('Triggers')
      .addItem('Create Daily Task', 'CreateDailyTask')
      .addToUi();
};  

1-е редактирование:

Наконец, если есть способ, чтобы изменение даты в каждой вставленной строке указывало на то, что каждая из них отличается, это было бы вишенкой на торте.

2-е изменение:

Я также упомяну, хотя и не знаю, имеет ли это значение, что в моем исходном листе "Заказы на работу" есть сценарий, который автоматически сортирует его:

/**
 * Automatically sorts the 30th column (not the header row) Ascending.
 */
function onEdit(event){
  var sheet = event.source.getSheetByName("Work Orders");
  var editedCell = sheet.getActiveCell();

  var columnToSortBy = 30;
  var tableRange = "A2:AJ"; // What to sort.

  if(editedCell.getColumn() == columnToSortBy){   
    var range = sheet.getRange(tableRange);
    range.sort( { column : columnToSortBy, ascending: true } );
  }
}

Любая помощь приветствуется.


person James Correa    schedule 13.01.2017    source источник
comment
Вы запускали это в отладчике?   -  person Karl_S    schedule 13.01.2017


Ответы (1)


В коде есть ошибки и отсутствуют необходимые методы getValue. Вот небольшая настройка, с которой можно начать:

function CreateDailyTask() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var source_sheet = ss.getSheetByName("Work Orders");
  var target_sheet = ss.getSheetByName("Schedule");
  var source_range = source_sheet.getActiveRange();
  var source_row = source_range.getRow();
  var source_data = source_range.getValues();
  var startdate = source_sheet.getRange("AD"+(source_row)).getValue();
  var enddate = source_sheet.getRange("AE"+(source_row)).getValue();
  var duration = enddate - startdate + 1
  var event = (source_sheet.getRange("AI"+(source_row)).getValue());
  var last_row = target_sheet.getLastRow();
  var target_range = target_sheet.getRange("A"+(last_row+1)+":AJ"+(last_row+1));
  Logger.log(startdate+' '+enddate+' '+duration+' '+event); //use Logger to help you debug, this one puts the variables into the Logs (from View menu)

  if (source_sheet.getRange("AI"+(source_row)).getValue() == "Yes") {
    target_sheet.insertRowAfter(last_row);
    source_range.copyTo(target_range);
  }
}

Примечание. Для того, чтобы это работало, вы должны выбрать всю строку данных на листе «Рабочие задания». Это похоже на ваш предполагаемый рабочий процесс, основанный на вашем коде, хотя я не уверен, что это действительно намерение.

person buzzdalf    schedule 14.01.2017