Моя цель
Я пытаюсь связать строки на двух разных листах в одной электронной таблице в соответствии со значением в ячейке. Основная идея состоит в том, что если значение в столбце B в Sheet1 имеет совпадающее значение в столбце B в Sheet2, гиперссылка должна быть добавлена в ячейку с согласованным значением в Sheet1, связываясь со всей строкой согласованного значения в Sheet2.
Что я сделал
Как вы можете видеть из приведенного ниже кода, он ищет совпадения, если он найден, он редактирует совпадающие значения, чтобы добавить гиперссылки. Я не только хочу вставить «связанные» согласованные значения в новый массив, мне также нужны несоответствующие значения без ссылки. Идея состоит в том, что ссылка будет добавлена, если совпадение будет найдено, в противном случае значение все равно будет добавлено, только без ссылки.
function linkToContacts(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var Sheet1 = ss.getSheetByName("Sheet1");
var Sheet2 = ss.getSheetByName("Sheet2");
var Sheet2ID = Sheet2.getSheetId();
var arrSheet1 = Sheet1.getRange(4,2,Sheet1.getLastRow()-3).getValues(); // -3 because I have 3 row as headers before the data, which start in row 4 col B
var arrSheet2 = Sheet2.getRange(4,2,Sheet2.getLastRow()-3).getValues(); // -3 because I have 3 row as headers before the data, which start in row 4 col B
var arrOutput = [];
for(var i = 0; i<arrSheet1.length;i++){
for(var j = 0; j<arrSheet2.length;j++) {
if(arrSheet1[i][0] === arrSheet2[j][0]){
arrOutput.push(['=HYPERLINK("#gid=' + Sheet2ID + '&range=' + Sheet2.getRange(j+4,2,1,Sheet2.getLastColumn()-1).getA1Notation() + '";"' + arrSheet1[i][0] + '")']);
} else {
arrOutput.push([arrSheet1[i][0]]);
}
}
}
Sheet1.getRange(4,2,Sheet1.getLastRow()).clearContent();
Sheet1.getRange(4,2,arrOutput.length).setValues(arrOutput);
}
Эта проблема
Два массива содержат только уникальные значения соответственно. Проблема в том, что из-за двойного цикла каждый элемент проверяется длиной arrSheet2. Так, например, представим себе такой сценарий:
var arrSheet1 = [apple,avocado,banana];
var arrSheet2 = [apple,banana,mango,];
arrOutput
приведет к:
arrOutput = [
apple(link),apple,apple,
avocado,avocado,avocado,
banana(link),banana,banana
];
В быстром, вероятно, неэлегантном способе решения проблемы я попытался удалить дубликаты frm arrOutput
, но, очевидно, значение со ссылкой и значения без него отличаются, поэтому лучшее, что он может получить с этим решением, таково:
arrOutput = [
apple(link),apple,
avocado,
banana(link),banana
];
Вопрос
Есть ли более умный / эффективный способ добраться до
arrOutput = [apple(link),avocado,banana(link)];
или, если то, что я делаю, действительно имеет смысл, что мне делать, чтобы получить результат выше?