1

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

1 回答 1

6

您可以为 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); 
}

虽如此,您可以使用一些解决方法来仅使用电子表格函数提供最终结果:

=ArrayFormula(UNIQUE(TRANSPOSE(SPLIT(CONCATENATE('Items'!A3:D15&CHAR(9));CHAR(9)))))
于 2012-09-18T23:03:29.987 回答