我有 App 脚本,它是从工作表 2 到工作表 1 的 vLookup 数据数据,并将工作表 2 中未找到的所有单元格复制到工作表 1,但如果两个工作表都没有按顺序排列,则会出现问题。所以我想逐列复制和粘贴(意味着在sheet2中找不到的单元格复制一列并粘贴到目标列是sheet1等等,这样一切都会井井有条)
`
function wa_15100603() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
// identify the sheets
var searchName = "Sheet2";
var lookupName = "Sheet1";
var search = ss.getSheetByName(searchName);
var lookup = ss.getSheetByName(lookupName);
// establish some sheet-related variables
var searchSearchCol = 4; // column B
var lookupSearchCol = 4; // column C
var colNum = 11; // column N
var searchStartRow = 3; // first row of data
var lookupStartRow = 3; // firt row of data
// calculate the number of rows of data in search
var searchLR = search.getLastRow();
var searchRows = searchLR-searchStartRow+1;
//Logger.log("DEBUG: SEARCH SHEET: start row = "+searchStartRow+", and last row = "+searchLR+", number of rows = "+searchRows)
// calculate the number of rows of data in lookup
var lookupLR = lookup.getLastRow();
var lookupRows = lookupLR-lookupStartRow+1;
//Logger.log("DEBUG: LOOKUP SHEET: start row = "+lookupStartRow+", and last row = "+lookupLR+", number of rows = "+lookupRows)
// get data
// lookup range is declared so that it can be used later
var lookupRange = lookup.getRange(lookupStartRow,1,lookupRows,colNum);
var lookupData = lookupRange.getValues();
//Logger.log(lookupData); // DEBUG
var searchData = search.getRange(searchStartRow,1,searchRows,colNum).getValues();
//Logger.log(searchData); // DEBUG
// get a 1D array for search search column
var searchSearchRange = searchData.map(function(e){return e[(+searchSearchCol-1)];});
Logger.log(searchSearchRange); // DEBUG
// get a 1D array for lookup search column
var lookupSearchRange = lookupData.map(function(e){return e[(+lookupSearchCol-1)];});
//Logger.log(lookupSearchRange); //DEBUG
// loop through each value in the search range to find a match in the lookup range
for (var v = 0;v<searchData.length;v++){
// find the search term in the lookup range
var result = lookupSearchRange.indexOf(searchSearchRange[v]);
//Logger.log("DEBUG: v = "+v+", result = "+result+", search value = "+searchSearchRange[v])
// if term is found, result is the row index on search
// otherwise, if not found, then result will be -1
if (result != -1){
// found a match, so test all the values on this line
// Logger.log("DEBUG: Match: Search value:"+searchSearchRange[v]+" was found on lookup sheet line#:"+result)
// loop through the values on the respective row for search and lookup
for (var i=0;i<colNum-searchSearchCol-1;i++){
if (searchData[v][(+searchSearchCol+i)] == lookupData[result][(+lookupSearchCol+i)]){
// if search value = lookup value then do nothing
//Logger.log("DEBUG: i:"+i+",search:"+searchData[v][(+searchSearchCol+i)]+", lookup:"+lookupData[result][(+lookupSearchCol+i)]+", Match- No action")
}
}
} else {
// if result = -1, then append whole row to lookup
// Logger.log("DEBUG: no match for this search search term, copy entire row to lookup")
// but first, pad a blank cell in the search data so that the search term will appear in column C
//Logger.log(searchData[v]); // DEBUG before
//Logger.log(searchData[v]); // DEBUG after
lookup.appendRow(searchData[v]);
}
}
// update the lookup data for any data changes
lookupRange.setValues(lookupData);
return;
}