google-apps-script - 构建 Google App 脚本以将相似的行合并为一行

标签 google-apps-script google-sheets

很多人问我为什么要这样做。我想这样做,以便当我进行邮件合并(这从图书馆向学生发送逾期图书列表)时,我不会向学生发送电子邮件多次。我从来没有多次使用这些数据,我只用它来发送快速消息,我从不操纵或使用这些数据,所以我不在乎它是否很难使用!我希望这是有道理的!感谢您迄今为止的反馈。

  1. Google 表格的开头如下: Screen Shot #1

  2. 我希望它看起来像这样:

Screen Shot #2

  • 我已经开始编写一些脚本,我相信你们都会 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/

    相关文章:

    google-apps-script - 取消删除项目文档后,工作表加载项停止加载

    google-apps-script - 访问 Google 文档中的评论

    javascript - 如何使用 HtmlService 运行服务器端功能

    正则表达式:在所选文本前面包含 3 个单词,在后面包含 3 个单词

    javascript - 如何打开没有菜单项的侧边栏?

    javascript - 如何打开给定的网址?

    google-apps-script - 使用Google Apps脚本在Gmail中创建 native 过滤器

    google-apps-script - 如何仅重命名电子表格中的第二个工作表?

    arrays - Google Sheets Arrayformula 计算速度非常慢

    javascript - 容器绑定(bind)脚本出​​现错误 "Expected OAuth 2 access token"