首页 > 解决方案 > Google 表格脚本 - 从第二行剥离额外数据并将其添加到第一行

问题描述

我正在尝试在 google sheet 脚本中构建一个脚本,该脚本将逐行迭代工作表,如果它在该行的第一个单元格中遇到与其上方相同的 ID 号,它会删除来自除 A 列和 B 列之外的每个单元格的数据,并将其附加到上面的行。理想情况下,这将适用于不确定数量的重复行 ID,可能是 2、可能是 3、可能是 4。

在删除我想要保留的数据(例如列 C 及以后)之后,我想删除已处理的重复 ID 行的全部内容,但我只是在它正确复制数据之后才将其放入我的脚本中.

在此示例中,工作表第 6、7 和 8 行具有相同的 ID 号(A 列)

在此处输入图像描述

这是我想要得到的结果:

在此处输入图像描述

这是我得到的结果:

在此处输入图像描述

我尝试了多种不同的方法,并多次拆除并重建了我的脚本,但没有得到我想要的结果:

function stripMiner() {
  var ss = SpreadsheetApp.openById("1WDPoTICQvdruxfhAwHLtA51fz05DqyZ-NhNfpAyPO6Y");
  var mainSheet = ss.getSheetByName("Main");
  var startRow = 5;
  var numRows = mainSheet.getLastRow();//obtains the last row in the sheet
  var setrgh = mainSheet
  var dataRange = mainSheet.getRange(startRow, 1,4,120); //rowStart, columnStart, row count, column count, the columncount needs to be large enough to encompass all your ancillary data
  var data = dataRange.getValues();
  var iter = 0;
  var maxItRow = 4;
  var prevIdNum = 0;
  var dupCount = 1;
  var cc1 = "P5"; //Cells to dump check values into
  var cc2 = "P6";
  var dumpRow = startRow;
  //if (numRows >= maxItRow){var maxIter = maxItRow;}

  for (i in data){
    if (iter != maxItRow){ //making sure we haven't gone over the iteration limit
      var row = data[i];
      var idNum = (row[0]);
      var jCount = 0; //resets icount if the id number is different icount is used to skip some cells in a row

      if (idNum == prevIdNum){//only proceed if we've hit another line with the same ID number
        dupCount = +1; //increment the dupcount value
        mainSheet.getRange(cc2).setValue("dupCount"+dupCount); //dupcount check value
        var rowIterStart = 5; //RowIterStart is used to add to rowiter, EG if your data is 20 columns wide, and you start transposing from column 4, then this will want to be about 17
        var rowIter = 1;
        for (j in row){
          if (jCount >= 2){ //the integer here is the column where it will begin to transpose data
            mainSheet.getRange(dumpRow-1,(rowIterStart*dupCount)+(rowIter)).setValue(row[j]); //startRow+(iter-dupCount)

            mainSheet.getRange(cc1).setValue("dumprow"+dumpRow);
          }
          rowIter+=1;
          jCount +=1;
        }
      }
      else{
        var dupCount = 1;

        dumpRow +=1;
      }
      prevIdNum = (row[0]); //sets the most recently processed rows ID number 
    }
    iter +=1;
  }
}

我不太确定我哪里出错了。有没有人有什么建议?谢谢!

(而且我仍然只是一个初学者,所以如果我忽略了任何明显的或采取了错误的方法来做到这一点,我很抱歉!)

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


在复制数据的情况下,提问者代码的结果来自一个复杂的循环。本质上,虽然识别出重复,但将复制的数据分配给正确的 rowID 存在计数错误。就清除数据而言,没有包括任何规定。

以下代码可以满足提问者的目标,尽管它远非完美。

目前,复制每个副本后的“最后一列”的重新计算是绝对的,而不是基于行的数字。因此,如果检测到重复项,例如 ID=3,则数据将被复制到第 12 列而不是第 6 列。这需要添加一个简单的 dupID 行计数器。

第二个因素是电子表格中最后一列的计算。
var dataRange = mainSheet.getRange(startRow, 1,Rowlast+1,120);
提问者使用了 120 列;为了保持一致性,我保留了这个数字。提问者应该重新评估这是否过度。


function ejb_so_5284922701() {

    var ss = SpreadsheetApp.openById("<<  insert questioners spreadsheet ID>>");
    var mainSheet = ss.getSheetByName("<< insert questioner's sheet name >>");

    var startRow = 5;

    // calculate the last row containing data
    var Rowvals = ss.getRange("A5:A").getValues();
    var Rowlast = Rowvals.filter(String).length; //6
    Logger.log("last row = " + Rowlast); // DEBUG


    // calculate the last column containing data
    var cell = mainSheet.getRange("A5"); //or however you determine "cell"
    var drCol = mainSheet.getDataRange().getLastColumn();
    Logger.log('getLastColumn = ' + drCol); //DEBUG
    for (var i = drCol; i >= 1; i--) {
        if (mainSheet.getRange(cell.getRow(), i).getValue() != "") {
            break;
        }
    }
    var lastColumn = i;
    Logger.log("Last column  with data = " + lastColumn); //DEBUG



    var setrgh = mainSheet

    // numColumns neds to be reviewed 
    var dataRange = mainSheet.getRange(startRow, 1, Rowlast + 1, 120); //rowStart, columnStart, row count, column count, the column count needs to be large enough to encompass all your ancillary data
    // start row = 5, 1= column A, 4, rows, 120, columns
    Logger.log("startRow = " + startRow + ", and the datarange = " + dataRange.getA1Notation()); //DEBUG

    var data = dataRange.getValues();
    Logger.log("length of data =" + data.length); //DEBUG


    var lastid = 0;

    for (i = 0; i < data.length; i++) {
        if (i == 0) {
            // if this is the first row, then assign anything but zero to last id
            lastid = 100;
            Logger.log(" this is the first row; set last id to 100");
        }

        var thisid = data[i][0];

        // evaluate whether this is a duplicate ID
        if (thisid == lastid) {

            // this is a dup
            Logger.log("i=" + i + ". This is a dup" + ", name is " + data[i][2]); //DEBUG
            var stufftocopyrange = mainSheet.getRange(startRow + i, 3, 1, 3);
            var stufftocopy = stufftocopyrange.getValues();
            Logger.log("the range to copy is " + stufftocopyrange.getA1Notation()); //DEBUG
            var targetrange = mainSheet.getRange(startRow + lastid - 1, lastColumn + 1, 1, 3);
            targetrange.setValues(stufftocopy);
            lastColumn = lastColumn + 3;
            var duprange = mainSheet.getRange(startRow + i, 1, 1, 5);
            Logger.log("the range to clear is " + duprange.getA1Notation()); //DEBUG
            duprange.clearContent();

        } else {
            // no dup

            //assign lastid value
            var lastid = thisid;
            Logger.log("i=" + i + ". No dup. Last id set to " + lastid); // DEBUG

        } // if

    } // end for loop

}


在此处输入图像描述


在此处输入图像描述


推荐阅读