Сценарий: транспонировать, найти и сохранить - PullRequest
0 голосов
/ 20 июня 2019

У меня есть некоторые данные, содержащие даты, имена пользователей и средний процент, который я хочу сохранить определенным образом.Моя проблема в том, что порядок имен пользователей может меняться в зависимости от того, добавляются ли новые.Поэтому мне нужно «найти» определенное имя пользователя и затем сохранить процентные данные в правильном столбце.

Я нашел некоторый код, который частично помогает мне сохранить данные, которые мне нужны.Но я мог бы использовать некоторую помощь в "найти" соответствующее имя пользователя и сохранить его в определенной части столбца.

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 ]

1 голос
/ 26 июня 2019

Хорошо для тех, у кого может быть похожая проблема, вот чем я закончил.

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]);
        }
    }
}
0 голосов
/ 21 июня 2019

Возможно, вам будет проще реализовать желаемую функциональность с помощью циклов, а не с помощью сопоставления.

Следующий код извлекает всех пользователей и их процентные данные в «Результат» и передает данные (в нужном формате).в «Архив» с процентными данными, вставленными с соответствующей отметкой времени в первую пустую строку.

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])
     }
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...