Попытка скопировать строку с одного листа на другой на основе значения в первом столбце каждой строки - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь переместить вчерашние данные с одного листа на другой лист (с одной вкладки внизу на другую вкладку внизу), а затем удалить их с первого листа (при сохранении уравнений).

Вот пример электронной таблицы .

У меня есть скрипт Google, работающий каждую ночь сразу после полуночи, и я попытался перебрать каждую строку, проверить, есть ли в первом столбце вчерашняя дата, затем скопировать строку на другой лист и удалитьоригинальный ряд.

function moveDataNewSheet() {
  var DATA_SPREADSHEET_ID = "16cy4ClKYEN_w5_c6KiR2zSjRsUD9ijxQD9DGffNRXtI";
  var Sheet1 = SpreadsheetApp.openById(DATA_SPREADSHEET_ID).getSheetByName("Sheet1");

  // create sheet with yesterdays date
  // if col1 has yesterdays date, 
  // then copy it to yesterdays sheet
  // delete row

  //get dateString
  var today = new Date();
  var yesterday = new Date();
  yesterday.setDate(today.getDate()-1);
  var dateString = Utilities.formatDate(yesterday, 'EDT', 'yyyy-MM-dd');

  // create new sheet with yesterdays date
  var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var yourNewSheet = activeSpreadsheet.getSheetByName(dateString);
  if (yourNewSheet != null) {
      activeSpreadsheet.deleteSheet(yourNewSheet);
  }
  yourNewSheet = activeSpreadsheet.insertSheet();
  yourNewSheet.setName(dateString);

  //set active sheet to Sheet1
  SpreadsheetApp.setActiveSheet(Sheet1);
  SpreadsheetApp.getActiveSpreadsheet().moveActiveSheet(1);

  // if col1 has yesterdays date copy it to dateString's sheet
  // delete row
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var source_sheet = SpreadsheetApp.getActiveSpreadsheet();
  var target_sheet = activeSpreadsheet.getSheetByName(dateString);

  for (var i = 0; i < Sheet1.getLastRow(); i++) {
    if (Sheet1.getRange(i,1).getValue() == Sheet1.getRange(i,1).substring(0,10)) {
      var last_row = target_sheet.getLastRow();
      target_sheet.insertRowAfter(last_row);
      source_sheet.getRange(i,1).clear();
    }
  }  

1 Ответ

0 голосов
/ 09 апреля 2019

ОП пытается создать резервную копию данных за предыдущий день на определенном листе, а затем удалить эти данные из источника. Код слишком сложен, не имеет ясности и не удаляет строки из источника.

Последовательность обработки следует методу OP:

  1. Укажите исходную электронную таблицу и исходную таблицу.
  2. Создать переменную для определения «вчерашней даты».
  3. Установить, существует ли лист с таким именем в исходной электронной таблице; если нет, то создайте и переименуйте лист.
  4. Назначить новый лист как целевой лист
  5. получить количество строк данных. Обычно можно использовать getLastRow, но это идентифицировало пустые фантомные строки.
  6. получить все данные из таблицы источников до цикла
  7. цикл по исходным данным
  8. построить строку заголовка и затем сравнить каждую метку времени с переменной для "вчерашней даты"
  9. где дата строки совпадает, поместите значения для каждого столбца в «rowarray», поместите массив «row» в «targetarray», очистите «rowarray» для следующей строки; увеличить счетчик строк.
  10. когда закончите с циклом, обновите целевой лист "targetarray".
  11. удалить строки из исходного листа.

function so_55537340_03() {

  // NOTE: code assumes that data is always in contiguous rows in date order

  // setup external sheet
  var ss = SpreadsheetApp.openById("<insert spreadsheet ID>");
  // Logger.log("DEBUG: ss = "+ss.getName());//DEBUG
  var sourceSheet = ss.getSheetByName("Sheet1");
  //Logger.log("DEBUG: source sheet: "+sourceSheet.getName());//DEBUG

  //get dateString
  var today = new Date();
  var yesterday = new Date();
  yesterday.setDate(today.getDate() - 1);
  //Logger.log("DEBUG: yesterday: "+yesterday);//DEBUG
  var dateString = Utilities.formatDate(yesterday, 'EDT', 'yyyy-MM-dd');
  // Logger.log("DEBUG: datestring: "+dateString);//DEBUG

  // create new sheet with yesterdays date
  // get the sheet, returns null if not exist
  var yourNewSheet = ss.getSheetByName(dateString);
  // Logger.log("DEBUG: yournewsheet: "+yourNewSheet);//DEBUG

  // test if sheet exists
  if (yourNewSheet != null) {
    // Logger.log("DEBUG: the spreadsheet is NOT null");//DEBUG
    // the sheet exists, so what??
    //ss.deleteSheet(yourNewSheet);
  } else {
    // Logger.log("DEBUG: the spreadsheet is null");//DEBUG
    // the sheet doesn't exist, so create and rename the sheet
    yourNewSheet = ss.insertSheet();
    yourNewSheet.setName(dateString);
  }

  // assign a variable to the target sheet
  var targetSheet = ss.getSheetByName(dateString);
  // Logger.log("DEBUG: target sheet: "+targetSheet.getName());// DEBUG

  // get the number of rows of data in column A for a loop (getLastrow was unreliable)
  var Avals = sourceSheet.getRange("A1:A").getValues();
  var Alast = Avals.filter(String).length;
  // Logger.log("DEBUG: source last row: "+Alast);//DEBUG

  // define the source range and get the data
  var sourceRange = sourceSheet.getDataRange();
  var sourceData = sourceRange.getValues();
  // Logger.log("DEBUG: sourcerange = "+sourceRange.getA1Notation()+", and number of rows of data: "+Alast);//DEBUG

  // establish arrays for pasting row results and total results to target sheet
  var targetData = [];
  var rowData = [];

  // create variable to count rows to delete
  var rowcounter = 0;

  // loop through the source data
  for (var i = 0; i < Alast; i++) {

    // clear rowData before each new row
    rowData = [];

    // test for row 1/headers
    if (i == 0) {

      // build the header row in the target
      rowData.push(sourceData[i][0]);
      rowData.push(sourceData[i][1]);
      rowData.push(sourceData[i][2]);
      rowData.push(sourceData[i][3]);
      rowData.push(sourceData[i][4]);
      rowData.push(sourceData[i][5]);
      rowData.push(sourceData[i][6]);
      rowData.push(sourceData[i][7]);

      // push row data on targetData
      targetData.push(rowData);
    }

    // process for rows other than header
    if (i > 0) {

      //Logger.log("DEBUG: rowdate: "+sourceData[i][0]);//DEBUG
      // get the substring
      var sourcecelldate = sourceData[i][0].substring(0, 10);
      //Logger.log("DEBUG: data substring: "+sourcecelldate);//DEBUG

      // if the data substring equals the datestring for yesterday
      if (sourcecelldate == dateString) {
        //Logger.log("DEBUG: dates align, do something");//DEBUG
        // build the data for the row
        rowData.push(sourceData[i][0]);
        rowData.push(sourceData[i][1]);
        rowData.push(sourceData[i][2]);
        rowData.push(sourceData[i][3]);
        rowData.push(sourceData[i][4]);
        rowData.push(sourceData[i][5]);
        rowData.push(sourceData[i][6]);
        rowData.push(sourceData[i][7]);

        // push row data on targetData
        targetData.push(rowData);
        rowcounter++
        Logger.log("Row counter: " + rowcounter);

      } else {
        //Logger.log("DEBUG: dates DO NOT align, do nothing");//DEBUG
      }
    }

  } // end of loop 

  // get number of rows of targetdata
  //Logger.log("DEBUG: length of targetdata"+targetData.length);//DEBUG
  // define the data range for the target sheet  
  var targetrows = targetSheet.getRange(1, 1, targetData.length, 8);
  // paste the data onto the targetsheet
  targetrows.setValues(targetData);

  // delete the old rows from the source sheet
  //Logger.log("DEBUG: number of rows to delete = "+rowcounter);
  sourceSheet.deleteRows(2, rowcounter);

}

Я оставил операторы «Logger» в следующем коде для устранения проблем значений на различных этапах процесса.

...