很多人问我为什么要这样做。我想这样做,以便当我进行邮件合并(这从图书馆向学生发送逾期图书列表)时,我不会向学生发送电子邮件多次。我从来没有多次使用这些数据,我只用它来发送快速消息,我从不操纵或使用这些数据,所以我不在乎它是否很难使用!我希望这是有道理的!感谢您迄今为止的反馈。
Google 表格的开头如下:
我希望它看起来像这样:
我已经开始编写一些脚本,我相信你们都会 mock 它(我对编程知之甚少)。不过,能够做到这一点就太棒了。基本上,通过将这些行的列的值放在一行中,将在第 1 列中具有相同条目的行合并起来。可以添加数字,并用逗号或换行符分隔数据。
这就是我到目前为止所拥有的......
function myFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); var last = sheet.getLastRow(); //find identical entries in column 1// for(i in data){ var row = data[i]; var duplicate = false; for(j in newData){ if(row.join() == newData[j].join()){ duplicate = true; } } if(!duplicate){ newData.push(row); } } //add information from rows of identical entries into one row using a comma// //delete empty rows// }
最佳答案
这有点困惑,但它是用我的假数据运行的。希望你能让它和你的一起运行。通常我需要进行一些调整才能使这样的事情变得更加精简。我在那里有一些评论来解释一些关键项目。
function rowMerge() {
var firstRow = 2;
var firstCol = 1;
var sht = SpreadsheetApp.getActiveSheet();
sht.getRange(firstRow, firstCol, sht.getLastRow() - firstRow + 1, sht.getLastColumn() - firstCol + 1).sort(1);
sht.appendRow(['***','***','Control-z one more time','***','***']); //need a throwaway row to get last data element out since I'm moving out element[i-1]
var datR = sht.getDataRange();
var lastRow = datR.getLastRow();
var lastCol = datR.getLastColumn();
var datA = datR.getValues();
sht.getRange(2,1,lastRow - firstRow + 1,lastCol - firstCol + 1).clearContent().setWrap(true);
var datoutA = [];
var k=1;
var n = 0;
for(var i = 0;i < datA.length; i++)
{
if(i > 1)
{
if(datA[i][0] == datA[i-1][0])
{
k++; //k is the number of consecutive matching values
}
else
{
datoutA[n] = [];
if(k == 1)
{
// if k = 1 the datA[i-1] row gets copied into output array
for(var c = 0;c < datA[i-1].length; c++)
{
datoutA[n][c]=datA[i-1][c];
}
}
else
{
//i-1 to i-k rows get merged and copied into output array
var firstTime = true;
for(var a = 1;a <= k;a++)//input rows
{
for(var b = 0;b < datA[i].length -1;b++)//input columns
{
if(a > 1 || b > 0) //no delimiter for first row or first column
{
datoutA[n][b] += ', ';
}
if(firstTime || b == 0)// straight assignment for first row and running sum after that same with first column because we only want one of them because they're all the same.
{
datoutA[n][b] = datA[i - a][b];
}
else
{
datoutA[n][b] += datA[i - a][b];
}
}
if(firstTime)//first assignment then running sums for last column
{
datoutA[n][datA[i].length - 1] = Number(datA[i - a][datA[i].length-1]);
}
else
{
datoutA[n][datA[i].length - 1] += Number(datA[i - a][datA[i].length-1]);
}
firstTime=false;
}
var end = 'is near';
}
k=1; //consecutive counter
n++; //datoutA index
}
}
}
var datoutR = sht.getRange(2, 1, datoutA.length , datoutA[0].length);
datoutR.setValues(datoutA);
var colwidth = 250;
sht.setColumnWidth(2, colwidth);
sht.setColumnWidth(3, colwidth);
sht.setColumnWidth(4, colwidth);
}
关于google-apps-script - 构建 Google App 脚本以将相似的行合并为一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42569657/