繁体   English   中英

Google表格脚本-多行X重复多个字符串

[英]Google Sheets Script - Repeating Multiple Strings X Times in Multiple Rows

我怎样才能连续有效地重复10次“ SAT”,然后再连续有效地重复“ SUN”次?

我知道我可以使用复制/粘贴,单击/拖动,自定义函数( 例如这样 )以及诸如TRANSPOSE(SPLIT(TRIM(REPT())等内置函数的组合。如果您不必经常使用它们,那将非常有用。但是,不仅将“ SAT”和“ SUN”作为值,这很快变得很麻烦。

几天前我问过类似的问题 在处理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。 通过提供的第一段代码,我可以将它们分开,但是我很想知道是否有更简单/更好的方法。

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

D1:D7将通过FRI包含SAT

假设您只想将行追加到电子表格中,就可以做到这一点:

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列。

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的另一个循环,我们有了所需的解决方案。

再次按照最佳实践建议使用数组和批量读取/写入的更有效解决方案...

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM