尝试根据每一行第一列中的值将一行从一张纸复制到另一张纸

时间:2019-04-05 14:13:04

标签: google-apps-script google-sheets google-sheets-api google-sheets-formula

我正在尝试将昨天的数据从一张纸上移到另一张纸上(从底部的一个标签移动到底部的另一个标签),然后从第一张纸上删除它(同时保留方程式)。

这里是example spreadsheet

我有一个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 :(得分:0)

OP尝试将前一天的数据备份到特定的工作表,然后从源中删除该数据。该代码过于复杂,缺乏清晰性,并且无法从源代码中删除行。

处理顺序遵循OP的方法:

  1. 标识源电子表格和源工作表。
  2. 创建一个变量以标识“昨天的日期”。
  3. 确定源电子表格中是否存在该名称的工作表;如果不是,则创建并重命名工作表。
  4. 将新工作表分配为目标工作表
  5. 获取数据行数。通常可以使用getLastRow,但这标识了空的“幻像”行。
  6. 在循环之前
  7. 从源工作表中获取所有数据
  8. 遍历源数据
  9. 构建标题行,然后针对“昨天的日期”变量评估每个时间戳记
  10. 在行日期匹配的情况下,将每列的值压入“ rowarray”,将“ row”阵列压入“ targetarray”,清除下一行的“ rowarray”;增加一个行计数器。
  11. 完成循环后,使用“ targetarray”更新目标表。
  12. 从源工作表中删除行。

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”语句,以便对过程中各个阶段的值进行故障排除。

相关问题