2012-09-18 22 views
1

我有第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}); 
    } 
}; 

回答

6

您可以使用该getRange()方法,它使用列数字,而不是A1串符号的alternative parameter specification。这将更容易增加。这就是说,因为您只复制了值,所以在块中获取源代码范围可能会更好(更高效),并使用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))))) 
+0

谢谢!我现在将使用最后一个,因为它似乎是最容易实现的。我也欣赏其他代码,我会通过它并了解它是如何工作的。 – EpiphanyMachine

相关问题