javascript - 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;
}
}
我不太确定我哪里出错了。有没有人有什么建议?谢谢!
(而且我仍然只是一个初学者,所以如果我忽略了任何明显的或采取了错误的方法来做到这一点,我很抱歉!)
解决方案
在复制数据的情况下,提问者代码的结果来自一个复杂的循环。本质上,虽然识别出重复,但将复制的数据分配给正确的 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
}
后
推荐阅读
- python-3.x - 如何循环遍历 RadioField 列表
- c# - 在没有 NEST 的 .NET 中进行非平凡的 ElasticSearch 搜索
- javascript - 如何使用 html2canvas 打印画布
- java - 图像更改 getText
- java - 获取与特定组或 contxt 相关的 Json 属性
- c - 为什么在已经定义函数的源代码中添加头文件?
- android - 如何使用 Android UI 类重新编码 JavaFX 应用程序?
- pandas - 按日期分隔推文会发出警告
- python - 绘制从事件开始到结束的时间矩形 (yAxis)
- java - 最新版Gson用什么替换StringMap