Epi*_*ine 1 google-sheets google-apps-script
我在第3-15行的多列中有数据.我想找到该数据集中的所有唯一值,并将其输出到一列.
唯一函数一次只能执行一列,因此不适用于我的目的.
我正在编写一个脚本,它将打开一个新工作表并将值复制并粘贴到同一列中(将来自多个列的数据合并到一个更长的列中).然后,我将在包含所有数据的单个列上运行唯一函数,以获得原始数据集中所有唯一值的输出(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});
}
};
Run Code Online (Sandbox Code Playgroud)
您可以为getRange()方法使用备用参数规范,该方法使用列号而不是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);
}
Run Code Online (Sandbox Code Playgroud)
而那说,你可以使用一点的一种解决方法只使用电子表格的功能,以提供最终的结果:
=ArrayFormula(UNIQUE(TRANSPOSE(SPLIT(CONCATENATE('Items'!A3:D15&CHAR(9));CHAR(9)))))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2540 次 |
| 最近记录: |