Dan*_*Cue 2 google-sheets google-apps-script google-sheets-formula
我正在尝试组合一个函数,该函数允许我根据关键列将列的信息从一张纸拉到另一张纸上。这与 excel/google 中的索引匹配或 vlookup 类似。
样本数据:
我尝试过的:
function vlookup(importFromSht, importToSht, importFromCompCol, importToCompCol,importFromCol, importToCol){
var lastImportFromRN = importFromSht.getLastRow();
var lastImportToRN = importToSht.getLastRow();
var importFromCompArr = importFromSht.getRange(2, importFromCompCol, lastImportFromRN, 1).getValues();
var importToCompArr = importToSht.getRange(2, importToCompCol, lastImportToRN, 1).getValues();
var importFromArr = importFromSht.getRange(2, importFromCol, lastImportFromRN, 1).getValues();
var importToArr = [];
for (var i in importToCompArr) {
for (var j in importFromCompArr){
if (importToCompArr[i].toString() == importFromCompArr[j].toString()) {
importToArr.push(importFromArr[j]);
}
}
}
//Paste to column
importToSht.getRange(2,importToCol,importToArr.length,1).setValues(importToArr);
}
Run Code Online (Sandbox Code Playgroud)
参数定义
要求:
O(n 2 ):对于数组 1 中的每个元素,从上到下迭代数组 2。即使在数组 2 中找到匹配项后,循环也不会中断(break),但内部循环会不必要地完成,直到数组 2 末尾。
getValues() 对于同一张纸的两列,请求两次。接触电子表格的成本很高。所以,限制它是必要的。
一种可能实现的解决方案O(n):
const ss = SpreadsheetApp.getActive();
/**
* @param {GoogleAppsScript.Spreadsheet.Sheet} fromSht -Sheet to import from
* @param {GoogleAppsScript.Spreadsheet.Sheet} toSht -Sheet to import to
* @param {Number} fromCompCol -Column number of fromSht to compare
* @param {Number} toCompCol -Column number of toSht to compare
* @param {Number} fromCol -Column number of fromSht to get result
* @param {Number} toCol -Column number of toSht to get result
* @author /sf/users/588311741/
*/
function vlookup_custom(
fromSht = ss.getSheetByName('Sheet1'),
toSht = ss.getSheetByName('Sheet2'),
fromCompCol = 1,
toCompCol = 1,
fromCol = 2,
toCol = 2
) {
const toShtLr = toSht.getLastRow();
const toCompArr = toSht.getRange(2, toCompCol, toShtLr - 1, 1).getValues();
const fromArr = fromSht.getDataRange().getValues();
fromCompCol--;
fromCol--;
/*Create a hash object of fromSheet*/
const obj1 = fromArr.reduce((obj, row) => {
let el = row[fromCompCol];
el in obj ? null : (obj[el] = row[fromCol]);
return obj;
}, {});
//Paste to column
toSht
.getRange(2, toCol, toShtLr - 1, 1)
.setValues(toCompArr.map(row => (row[0] in obj1 ? [obj1[row[0]]] : [null])));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7182 次 |
| 最近记录: |