เป้าหมายของฉัน
ฉันกำลังพยายามเชื่อมโยงแถวในสองแผ่นงานที่แตกต่างกันในสเปรดชีตเดียวกันตามค่าในเซลล์ แนวคิดพื้นฐานคือหากค่าในคอลัมน์ 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)];
หรือในกรณีที่สิ่งที่ฉันทำอยู่สมเหตุสมผลจริงๆ ฉันควรทำอย่างไรเพื่อให้ได้ผลลัพธ์ข้างต้น