我在第3-15行的多个列中有数据。我希望找到该数据集中的所有唯一值,并将其输出到一列中。
unique函数一次只处理一列,所以它不能满足我的需要。
我正在编写一个脚本,它将打开一个新的工作表,并将值复制并粘贴到同一列中(将多个列中的数据合并到一个更长的列中)。然后,我将对包含所有数据的单个列运行唯一函数,以获得原始数据集中所有唯一值的输出(Items!B3:Z15)
我写了代码,但不知道如何递增一个字符。如果有更好的方法来实现这一点,我愿意接受建议,但我也很好奇是否有可能增加字母。
谢谢你的帮助,这是我当前的代码:
function uniqueIngredients() {
var book = SpreadsheetApp.getActiveSpreadsheet();
var r=1; // starting with row 1 new sheet
var d='B';
for (i=1; i<4; i++){ //testing by running 3 iterations
var m = 'Ingredients!A'+r; //Intially return Ingredients!A1 then incremented by 11 ex A12
var c = 'Items!'+d+'4:'+d+'15'; // Initially return Items!B3:B15 then incremented by letter ex Items!C3:C15
r = r+12; // add 12 spaces before next copy (max number of ingredients for each item)
d++;
book.getRange(c).copyTo(book.getRange(m), {contentsOnly:true});
}
};发布于 2012-09-19 07:03:30
可以对getRange()方法使用alternative parameter specification,该方法使用列号而不是A1字符串表示法。这将更容易递增。
也就是说,由于您只复制值,因此更好(更有效)的做法是获取块中的源范围,并使用Javascript将其转换为一列数组,然后设置这些值:
function uniqueIngredients() {
var ss = SpreadsheetApp.getActive();
var sourceValues = ss.getSheetByName('Items').getRange('A3:D15').getValues();
var target = ss.getSheetByName('Ingredients');
var result = [];
for (var i = 0; i < sourceValues[0].length; i++) {
for (var j = 0; j < sourceValues.length; j++) {
result.push([sourceValues[j][i]]);
}
}
target.getRange(1, 1, result.length, 1).setValues(result);
}也就是说,您可以使用一些变通方法,仅使用电子表格函数来提供最终结果:
=ArrayFormula(UNIQUE(TRANSPOSE(SPLIT(CONCATENATE('Items'!A3:D15&CHAR(9));CHAR(9)))))https://stackoverflow.com/questions/12485832
复制相似问题