脚本:转置,查找和保存

时间:2019-06-20 15:04:09

标签: google-apps-script

我有一些数据,其中包含日期,用户名和要以某种方式保存的平均百分比。我的问题是用户名的顺序可以更改,具体取决于是否添加了新用户名。因此,我需要“查找”特定的用户名,然后将百分比数据保存在正确的列中。

我发现一些代码可以部分帮助我保存所需的数据。但是我可以在“查找”相应的用户名中使用一些帮助,并将其保存在某个“列”部分中。

function save() {

 var sss = SpreadsheetApp.getActive();
 var ss = sss.getSheetByName('Result');
 var range = ss.getRange('B1:B10');
 var data = range.getValues();


 var tss = SpreadsheetApp.getActive();
 var ts = tss.getSheetByName('Archive');

   ts.getRange(ts.getLastRow()+1, 1,data[0].length,data.length)
    .setValues(Object.keys(data[0]).map ( function (columnNumber) {
      return data.map( function (row) {
        return row[columnNumber];
      });
    }));
  }

基本上是这样的:Data

结果如下所示: Result

谢谢您的帮助。

2 个答案:

答案 0 :(得分:1)

好吧,对于那里可能有类似问题的任何人,这就是我最终得到的结果。

function extractAttendance() {
    var currentSheet = SpreadsheetApp.getActive();
    var attendanceTab = currentSheet.getSheetByName('Data_Filtered');
    var userData = attendanceTab.getRange('B1:B').getValues();

    var percentageData = attendanceTab.getRange('I1:I').getValues();

    var archiveTab = currentSheet.getSheetByName('Archive');
    var existingUsersRow = archiveTab.getRange('1:1');

    var newRowNumber = archiveTab.getLastRow() + 1;
    archiveTab.getRange(newRowNumber, 1).setValue(new Date());

    for (var i = 1; i < userData.length; i++) {
        var user = userData[i][0];
      if (user === '') {
        continue;
      }
        var existingUsers = existingUsersRow.getValues()[0];
        var exists = false;
        var existingColumnNumber = -1;

        for (var j = 0; j < existingUsers.length; j++) {
            if (existingUsers[j] === user) {
                exists = true;
                existingColumnNumber = j + 1;
                break;
            }
        }

        if (exists) {
            archiveTab.getRange(newRowNumber, existingColumnNumber).setValue(percentageData[i]);
        } else {
            var newColumnNumber = archiveTab.getLastColumn() + 1;
            archiveTab.getRange(1, newColumnNumber).setValue(user);
            archiveTab.getRange(newRowNumber, newColumnNumber).setValue(percentageData[i]);
        }
    }
}

答案 1 :(得分:0)

通过循环而不是通过映射来实现所需的功能可能会更容易。

以下代码在“结果”中检索所有用户及其百分比数据,并将数据(以您所需的格式)传输到“存档”,并将百分比数据与相应的时间戳粘贴到第一行。

function save() {

 var sss = SpreadsheetApp.getActive();
 var ss = sss.getSheetByName('Result');
 var range = ss.getRange('B1:B');
 var percentageRange = ss.getRange('G1:G');
 var userData = range.getValues();
 var percentageData = percentageRange.getValues();

 var tss = SpreadsheetApp.getActive();
 var ts = tss.getSheetByName('Archive');

   var userRow=1;
   var percentageRow=(ts.getLastRow()+1)
  for(var i=0; i<=userData.length; i++)
   {
     {
       var j=(i+2);
       ts.getRange(userRow, j).setValue(userData[i])
       ts.getRange(percentageRow, 1).setValue(new Date())
       ts.getRange(percentageRow, j).setValue(percentageData[i])
     }
    }
  }