Google apps script 谷歌应用程序脚本(电子表格)-将数据整合到一张表格中

Google apps script 谷歌应用程序脚本(电子表格)-将数据整合到一张表格中,google-apps-script,Google Apps Script,以下是设置 我们根据项目得分与所有员工进行竞赛。每个项目有两类员工(每类4名员工)和两个分数(每类员工一个分数)。 我需要获取员工的所有分数并将其输出到电子表格中 工作表说明 标记为“示例数据”的表是我们将从中提取数据的源 我们需要匹配编辑器和编辑器分数 我们需要匹配网站管理员和网站管理员的分数 标记为“示例输出”的工作表是我希望在另一个名为“竞赛结果”的电子表格中生成的工作表,其工作表名称来自源工作表(它们按日期范围命名)。 我们需要按类别对每个员工进行汇总 我们需要将单个员工的所有分数汇总到

以下是设置

我们根据项目得分与所有员工进行竞赛。每个项目有两类员工(每类4名员工)和两个分数(每类员工一个分数)。

我需要获取员工的所有分数并将其输出到电子表格中

工作表说明
标记为“示例数据”的表是我们将从中提取数据的源

  • 我们需要匹配编辑器和编辑器分数
  • 我们需要匹配网站管理员和网站管理员的分数
  • 标记为“示例输出”的工作表是我希望在另一个名为“竞赛结果”的电子表格中生成的工作表,其工作表名称来自源工作表(它们按日期范围命名)。

  • 我们需要按类别对每个员工进行汇总
  • 我们需要将单个员工的所有分数汇总到该行
  • 我发现这似乎至少可以处理信息,并以我认为可以做到的方式进行比较,但由于缺乏经验,我未能使其发挥作用

    不知道什么是转置,直到有人评论:) 下面是另一篇文章中的解决方案,介绍了如何使用GoogleApps脚本和电子表格选项来实现它。

    下面是我用来让它工作的实际代码(这有点可怕,但我尝试过)关于如何改进它的建议:

    function createScoreSheet() {
    
      // Get Source spreadsheet
      var source = SpreadsheetApp.getActive();
      var sourceSheet = source.getActiveSheet();
      var SourceActivate = sourceSheet.activate();
      // Set Sheet Name
      var sheetName = sourceSheet.getSheetName();
      // Set Values to transpose and combine
      var sourceEditor = sourceSheet.getRange("C1:C51");
      var sourceWeb = sourceSheet.getRange("D1:D51");
      var editorScores = sourceSheet.getRange("L1:L51");
      var webScores = sourceSheet.getRange("K1:K51");
      // Used to create a new spreadsheet
      var sheetNameNew = sheetName + " Scores";
      var createSheet = SpreadsheetApp.getActive().insertSheet(sheetNameNew,0);
      var targetSheet = source.getSheetByName(sheetNameNew);
      var totalScore = 1;
      // s is the the counter we use to stick values into the rows
      var s = 3;
      // n is the the counter we use to stick values into the columns
      var n = 1;
      // loops through twice, once for the editor values, once for the webmaster
      for (var j = 1; j<3; j++) {
        if (j == 1) {
          // grab values for the editors and copy to new sheet
          sourceEditor.copyTo(targetSheet.getRange("A1"));
          editorScores.copyTo(targetSheet.getRange("B1"));
          // delete the header row then sort the column ASC by default     
          targetSheet.deleteRow(n);
          targetSheet.sort(1);
          // Find the last value to see how many scores we have
          var lastRow = targetSheet.getLastRow();
        }
        if (j == 2) {
          // grab values for the webmasters and copy to new sheet
          sourceWeb.copyTo(targetSheet.getRange(n,1));
          webScores.copyTo(targetSheet.getRange(n,2));
          // delete the header row then sort the column ASC by default 
          targetSheet.deleteRow(n);
          lastRow = targetSheet.getLastRow();
          targetSheet.getRange(n,1,lastRow,2).sort(1);
          lastRow = targetSheet.getLastRow();
        }
        // this loop will check to see if the value of the cell is equal to the next on the list and move the score
        for (var i = 1; i<lastRow+1; i++) {
          // Grab the name of the current row and the next
          var firstName = targetSheet.getRange(n,1).getValue();
          var nextName = targetSheet.getRange(n+1,1).getValue();
          // Grab the scores
          var oldScore = targetSheet.getRange(n+1,2);
          var newScore = targetSheet.getRange(n,s);
          // Loop to check to see if the firstname is blank and break to find the next value
          if (firstName === "") {
           break; 
          }
          // checks to see if name is equal to the next then shifts then copies the score and adjust the horizontal position
          if (firstName == nextName) {
            totalScore = oldScore + newScore;
            oldScore.copyTo(newScore);
            s = s+1;
            targetSheet.deleteRow(n+1);
          }
          // resets horizontal position for the score and increases the row 
          else {
            s=3;
            n=n+1;
          }
        }
        // kills remaining rows
        targetSheet.deleteRows(n,37);
      }
    }
    
    函数createScoreSheet(){
    //获取源电子表格
    var source=SpreadsheetApp.getActive();
    var sourceSheet=source.getActiveSheet();
    var SourceActivate=sourceSheet.activate();
    //设置图纸名称
    var sheetName=sourceSheet.getSheetName();
    //将值设置为转置和合并
    var sourceEditor=sourceSheet.getRange(“C1:C51”);
    var sourceWeb=sourceSheet.getRange(“D1:D51”);
    var editorScores=sourceSheet.getRange(“L1:L51”);
    var webcores=sourceSheet.getRange(“K1:K51”);
    //用于创建新的电子表格
    var sheetNameNew=sheetName+“分数”;
    var createSheet=SpreadsheetApp.getActive().insertSheet(sheetNameNew,0);
    var targetSheet=source.getSheetByName(sheetNameNew);
    var totalScore=1;
    //s是用于将值粘贴到行中的计数器
    var s=3;
    //n是用于将值粘贴到列中的计数器
    var n=1;
    //循环两次,一次用于编辑器值,一次用于网站管理员
    
    对于(var j=1;j我会这样做:

    如果要自动生成名称,请将其写入输出表A1:

    =unique('Example Data'!B2:B)-此函数只生成A2-A5单元格的编辑器名称

    现在将其写入B2单元:

    =转置(filter('Example Data'!E:E,'Example Data'!B:B=A2))-此函数根据行开头的给定名称过滤编辑器点(在本例中为A2)。然后以水平形式转置结果。要获得其他行的结果,只需向下填充此公式

    我想你可以找到剩下的。:)


    希望有帮助。

    这确实有帮助,谢谢!