Скрипт Если тогда совпадение между двумя листами - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь сделать эту формулу =iferror(if(match($A2&F$1,arrayformula(Transpose!B$3:B&Transpose!B$1),0),"P"),"") сценарием для листов Google. По сути, формула запускается во всех остальных столбцах после F и в каждой строке до 2.

Например, в столбце H есть =iferror(if(match($A2&H$1,arrayformula(Transpose!C$3:C&Transpose!C$1),0),"P"),"")

, в столбце J - =iferror(if(match($A2&J$1,arrayformula(Transpose!D$3:D&Transpose!D$1),0),"P"),"") и так далее. Как я сейчас понимаю, эта формула вставлена ​​в каждую ячейку каждого другого столбца, и, поскольку я добавляю больше данных, мне нужно изменить формулу, чтобы она заняла слишком много времени. Я приложил рабочую книгу, чтобы вы могли видеть, о чем я говорю. Любая помощь будет оценена. Спасибо

https://docs.google.com/spreadsheets/d/1ZBrg4XoeL21mXwn93XT35kgjrE5pqx9cd3xEvfojIXM/edit?usp=sharing

Я пытался

  var ss=SpreadsheetApp.getActive().getSheetByName('Transpose')
  var Ts=SpreadsheetApp.openById('1ZBrg4XoeL21mXwn93XT35kgjrE5pqx9cd3xEvfojIXM').getSheetByName('Attendance')
  var meeting = ss.getRange("B3:B37").getValues();
  var targetNames = Ts.getRange("A2:A37").getValues();
  var writtingRange = Ts.getRange("F2:F37").getValues();
  var updatedUser = targetNames;
  var writtingColumn = -1;
  var coolMatrix;

  for (var i = 0; i < meeting.length; i++) {
    var name = meeting[i][0]
    for (var j = 0; j < targetNames.length; j++) {
      if (targetNames[j][0] == name) {
        for (var z = 0; z < writtingRange[0].length; z++) {
          if (writtingRange[j][z] == '' && writtingColumn < 0) {
            writtingColumn = z;
            break;
          }
        }
        writtingRange[j][writtingColumn] = meeting[i][1];
        updatedUser[j] = true;
      }
    }
  }
  Ts.getRange("F2:F37").setValues(writtingRange);
}

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

1 Ответ

0 голосов
/ 13 февраля 2020

У меня была проблема с пробелами в именах листа. Это из-за =transpose(split(B2,",")), где он разделяет каждый список, разделяя имена на ,. Проблема в том, что после комы есть пробел, и это портит сравнение между именами. Когда имя находится в первой позиции, у него нет пробела, но оно есть, если оно находится в другой позиции другого списка.

Я исправил это, снова получив каждый список и выполнив replace для удаления первого пробела каждого имени. Кроме того, вы должны удалить первый пробел каждого имени в списке участников Листа.

function myfunction() {

  var sprsheet = SpreadsheetApp.getActiveSpreadsheet();
  var transpose = sprsheet.getSheetByName("Transpose");
  var attendance = sprsheet.getSheetByName("Attendance");

  //Ranges of Transpose
  var colDates = transpose.getRange("B1:I1").getValues();
  var attendees = transpose.getRange("B2:I2").getValues();

  //Ranges of Attendance
  var eventsCol = ["F","H","J","L","N","P","R","T"]; //The dates of Transpose are different from the ones in Attendance, so I added "T" so the script doesn't broke.
  var kids = attendance.getRange("A2:A17").getValues(); //Increase this if you add more names ("Abraham Paz" was missing from this list)

  loop1:
  for (var i = 0; i < eventsCol.length; i++){ //For each column 

    var list = getIndividuals(attendees[0][i]); //Get the list of each Transpose row 2

    loop2:
    for (var x = 0; x < kids.length; x++){ //For each name in Attendance

      loop3:
      for (var y = 0; y < list.length; y++){ //Compare it with each name of the list

        if (list[y] == kids[x][0] || list[y] == " " + kids[x][0]){ //Second "or" is in case there is an space in the first position.

          attendance.getRange(eventsCol[i]+(x+2)).setValue("P");
          break loop3; //Once it finds a name it makes no sense to keep searching. Go back to the next name.

        } 

      }

    }
  }

}
//Split the list into each name, removing the first space
function getIndividuals(attendees){

  var individuals = attendees.split(",");

  for (var i = 0; i < individuals.length; i++){ 

    if (individuals[i][0] == " "){

      individuals[i][0].replace(" ", "");

    }

  }

  return individuals;
}

РЕЗУЛЬТАТ enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...