在google-apps-script中逐字递增

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)

Ada*_*amL 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); 
}
Run Code Online (Sandbox Code Playgroud)

说,你可以使用一点的一种解决方法只使用电子表格的功能,以提供最终的结果:

=ArrayFormula(UNIQUE(TRANSPOSE(SPLIT(CONCATENATE('Items'!A3:D15&CHAR(9));CHAR(9)))))
Run Code Online (Sandbox Code Playgroud)