Перемещение вновь добавленных столбцов с помощью Google Scripts

#javascript #google-apps-script #google-sheets #automation

#javascript #google-apps-script #google-sheets #автоматизация

Вопрос:

У меня есть скрипт, который ежедневно добавляет новые данные с нашей производственной линии. Однако, поскольку он просто добавляет данные, формат не такой, каким он нужен для представления.

Нам нужен следующий формат: Номер заказа — Дата — Строка — Приоритет

Формат, который мы импортируем, следующий: Дата — Строка — Приоритет — Порядок #

Это скрипт, который мы используем для ежедневного добавления данных:

   function CopySchedule() {

  var Production = SpreadsheetApp.openById("ProductionID"); //Production Schedule
  var ScheduleSheet = Production.getSheets()[0]; //Production Schedule Sheet 1
  var startRow = 2;
  var startCol = 1;
  var numRows = 1000;
  var numCol = 25;
  var ScheduleData = ScheduleSheet.getRange(startRow, startCol, numRows, numCol); //Get info from Production Schedule
  var Schedule = ScheduleData.getValues(); // Get Values
  var MySchedule = SpreadsheetApp.getActiveSpreadsheet(); //Current Spreadsheet
  var MySheet = MySchedule.getSheets()[5]; //Current Sheet on Spreadsheet
  var now = new Date(); //Today's date
  var today = Utilities.formatDate(now, "EST", "M-dd-yy"); //Reformat today date
    
  for (var x = 0; x < 1000; x  ) 
  {

     if (Schedule[x][0] == today) //if date is today
       {
          MySheet.appendRow(Schedule[x]); //add row from schedule to bottom of current sheet
        }
  }
  

}
  

Мы хотим, чтобы данные были представлены именно так

Вот как это добавляется в таблицу

Макросов было бы недостаточно, поскольку количество заказов, которые мы выполняем ежедневно, не является фиксированным #, если только не существует способа заставить макрос выбирать только новые ежедневные данные.

Ответ №1:

Формулировка проблемы:

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

 [Schedule[x][3],Schedule[x][0],Schedule[x][1],Schedule[x][2]]
  

Решения:

Это можно выполнить двумя способами. Один из способов — использовать appendRow() который не рекомендуется, особенно когда набор данных становится большим, а второй способ — использовать setValues() более эффективный.

первое решение с appendRow():

 function CopySchedule() {

  var Production = SpreadsheetApp.openById("ProductionID"); //Production Schedule
  var ScheduleSheet = Production.getSheets()[0]; //Production Schedule Sheet 1
  var startRow = 2;
  var startCol = 1;
  var numRows = 1000;
  var numCol = 25;
  var ScheduleData = ScheduleSheet.getRange(startRow, startCol, numRows, numCol); //Get info from Production Schedule
  var Schedule = ScheduleData.getValues(); // Get Values
  var MySchedule = SpreadsheetApp.getActiveSpreadsheet(); //Current Spreadsheet
  var MySheet = MySchedule.getSheets()[5]; //Current Sheet on Spreadsheet
  var now = new Date(); //Today's date
  var today = Utilities.formatDate(now, "EST", "M-dd-yy"); //Reformat today date
    
  for (var x = 0; x < 1000; x  ) 
  {

     if (Schedule[x][0] == today) //if date is today
       {
          MySheet.appendRow([Schedule[x][3],Schedule[x][0],Schedule[x][1],Schedule[x][2]]); 
        }
  }
  

}
  

2-е решение с setValues() — Рекомендуется:

  function CopySchedule() {

  var Production = SpreadsheetApp.openById("ProductionID"); //Production Schedule
  var ScheduleSheet = Production.getSheets()[0]; //Production Schedule Sheet 1
  var startRow = 2;
  var startCol = 1;
  var numRows = 1000;
  var numCol = 25;
  var ScheduleData = ScheduleSheet.getRange(startRow, startCol, numRows, numCol); //Get info from Production Schedule
  var Schedule = ScheduleData.getValues(); // Get Values
  var MySchedule = SpreadsheetApp.getActiveSpreadsheet(); //Current Spreadsheet
  var MySheet = MySchedule.getSheets()[5]; //Current Sheet on Spreadsheet
  var now = new Date(); //Today's date
  var today = Utilities.formatDate(now, "EST", "M-dd-yy"); //Reformat today date
    
  data = [];
  for (var x = 0; x < 1000; x  ) 
  {

     if (Schedule[x][0] == today) //if date is today
       {
          data.push([Schedule[x][3],Schedule[x][0],Schedule[x][1],Schedule[x][2]]);
        }
  }
  
MySheet.getRange(MySheet.getLastRow() 1,1,data.length,data[0].length).setValues(data);
}
  

Комментарии:

1. Это именно то, что нам было нужно, большое вам спасибо! Если бы у меня было больше данных, чем в начальных 4 столбцах, пришлось бы мне продолжать Schedule[x][n] цепочку? или есть сокращение для ввода вплоть до строки z?

2. @Index поскольку данные расписания упорядочены неправильно, вы должны указать это вручную.