Google表格脚本 - 在多行中重复多次字符串X次

时间:2018-02-05 17:29:18

标签: google-apps-script google-sheets

如何连续10次重复'SAT',然后连续'SUN'连续重复?

我知道我可以使用复制/粘贴,点击/拖动,自定义功能(like this)以及内置功能的组合,例如TRANSPOSE(SPLIT(TRIM(REPT()。如果你不喜欢那些就很棒)必须经常使用它们。然而,不仅仅是'SAT'和'SUN'作为价值,这很快变得麻烦。

几天前我问a similar question。使用dev1998Serge insas提供的解决方案,我在下面创建了一个工作脚本。

function testAtA1() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('TEST'));

  // start columns and rows
  var currentRow = 1;
  var startColumn = 1;
  var numRows = 1; // Change to match number of items listed for a given variable
  var numColumns = 1;
  var day1 = [
    ['SAT']
  ]
  var day2 = [
    ['SUN']
  ]
  Logger.log(day1);
  Logger.log(day2);

  var day1Length = day1.length;
  var day2Length = day2.length;
  Logger.log(day1Length);
  Logger.log(day2Length);

  var currentRow2 = currentRow + 10
  // ranges where values will be placed

  for (i = 0; i < 10; i++) { 
    var target1 = sheet.getRange(currentRow, startColumn, numRows, numColumns).setValues(day1);
    currentRow = currentRow + 1; // Change to match number of items listed for a given variable
  }

  for (i = 0; i < 10; i++) {
    var target2 = sheet.getRange(currentRow2, startColumn, numRows, numColumns).setValues(day2);
    currentRow2 = currentRow2 + 1
  }
}

除了上面的内容,我还尝试了

var days = [['SAT'],['SUN']]

我能够将其交替进行SAT,然后再进行SUN X次,但不能连续获得所有SAT和连续所有SUN。在我提供的第一个片段中,我能够将它们分开但是,我很想知道是否有更简单/更好的方式。

4 个答案:

答案 0 :(得分:0)

=ARRAYFORMULA(TRIM(TRANSPOSE(SPLIT(QUERY(REPT(D1:D7&"",10),,9^99),""))))

D1:D7将包含SAT到FRI

答案 1 :(得分:0)

假设您只想将行附加到电子表格中,这将解决问题:

function addText(){
  var ss = SpreadsheetApp.getActive().getActiveSheet();

  var satRow = [];

  for (var i = 0; i < 10; i++){
    satRow.push("SAT");
  }

  var sunRow = [];

  for (i = 0; i < 10; i++){
    sunRow.push("SUN");
  }

  ss.appendRow(satRow);
  ss.appendRow(sunRow)
}

appendRow()将一维数组作为参数。所以只需构建一个数组并附加它。

如果你需要在任意一点插入行,你可能最好使用自定义函数:

/**
 * Fills a range specified in rows and columns with the specified value
 *
 * @param {number} Number of rows to fill
 * @param {number} Number of columns to fill
 * @param {string} input The value to iterate.
 * @return An array containing the values
 * @customfunction
 */
function fillRange(rows,cols,str){

  var output = [[]];

  for (var i = 0; i < cols; i++){
    output[0].push(str);
  }

  for (var i = 1; i < rows; i++){
    output.push(output[0]);
  }

  return output;

}

要使用它,请输入单元格=fillRange(1,2,"SAT")以使用“SAT”填充一行中的2列。

答案 2 :(得分:0)

function testAtA1() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('Sheet1'));

  // start columns and rows
  var currentRow = 1;
  var startColumn = 1;
  var numRows = 10; // Change to match number of items listed for a given variable
  var numColumns = 1;
  var days = ['SAT','SUN','MON']
  for (d = 0;d < days.length ; d++) {
    var data = days[d]
    var target1 = sheet.getRange(currentRow, startColumn, numRows, numColumns).setValue(data);
    currentRow = currentRow+10
}
}

通过添加另一个变量d并使用d创建另一个循环 小于days.length,我们有一个理想的解决方案。

答案 3 :(得分:0)

再次使用best practice...

中建议的使用数组和批量读/写的更有效的解决方案
function testAtA1() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('TEST');

  // start columns and rows
  var currentRow = 1;
  var startColumn = 1;
  var numRows = 1; // Change to match number of items listed for a given variable
  var numColumns = 1;
  var day1 = 'SAT';
  var day2 = 'SUN';
  var data = sheet.getRange(1,1,sheet.getMaxRows(),sheet.getMaxColumns()).getValues();
  var currentRow2 = currentRow + 10 ;// ranges where values will be placed

  for (i = 0; i < 10; i++){
    data[i][0] = day1;
    data[i+10][0] = day2;
  }
  sheet.getRange(1,1,data.length,data[0].length).setValues(data);
}