如何将单个列中的一系列行从第一个空单元格复制到新列中

How to Copy a Range of Rows Within a Single Column into a New Column from the First Empty Cell

我是脚本编写的新手,我正在努力学习它,但我 运行 遇到了一个问题,我希望有人能够帮助我。

我可能无法很好地解释它,尤其是关于我使用的技术术语,但我会尽力而为。

本质上,我的目标是将 sheet1 中的 (B2:B23) 单元格范围从第一个可用单元格复制到 sheet2 中的 A 列中。但是,因为 sheet2 中的 B 列的值一直到第 450 行,我想从 A4 开始,所以我不能使用 getLastRow(),因为它会跳转到 A450.

*(B2:B23) 是固定的,我会定期将 C&P 值写入其中,但每次,当我 运行 我想要 sheet2A 的脚本时使用下一个空单元格中的新值进行更新。

我已经尝试提升和改编我在此处和其他地方找到的代码变体,但到目前为止没有任何乐趣。

我将列出一些我一直在尝试的函数,您也许可以纠正我哪里出错了。

var sheetFrom = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Batting");
var sheetTo = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Batsmen");
var colA = sheetTo.getRange('A:A').getValues();
var fcolA = colA.filter(function (e) {return e[0];});
var firstEmptyRowIncolA = fcolA.indexOf('')+1;


var valuesToCopy = sheetFrom.getRange(2, 2, sheetFrom.getMaxRows(), 1).getValues();
  sheetTo.getRange(firstEmptyRowIncolA+4,1,valuesToCopy.length,1).setValues(valuesToCopy);

}


function outputAppend() {
var sheetFrom = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Batting");
var sheetTo = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Batsmen");


var valuesToCopy = sheetFrom.getRange(2, 2, sheetFrom.getMaxRows(), 1).getValues();
sheetTo.getRange(sheetTo.getLastRow()+1,1,valuesToCopy.length,1).setValues(valuesToCopy);
}


function copytestdata() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName("Batting");
  var sheet2 = ss.getSheetByName("Batsmen");
  var players = sheet1.getRange("B2:B23");
  var row=4;
  var col=1;
  var value= players.getValue();

//  sheet1.getRange("B2:B23").copyTo(sheet2.getRange(sheet2.getLastRow()+1,1,1,1), {contentsOnly:true});
// }

  players.copyTo(sheet2.getRange(row,col)); 
  while(sheet2.getRange(row,col).getValue()!=""){
  row++
  }

//  while(sheet1.getRange(row,col).getValue()!=""){
//    row++;
//  }
//  
//  sheet2.getRange(row,col).setValue(value);
}```

As you can see, it's all a bit messy and I've tied myself up in knots, so any help would be great.
Thanks

为了使您的解决方案生效,您应该使用以下函数:

getNextIndexA() 用于从 Batsmen sheet.

中查找第一个空单元格的索引
function getNextIndexA() {
  var sheetTo = SpreadsheetApp.getActive().getSheetByName("Batsmen");
  var myValues = sheetTo.getRange("A:A").getValues();
  var i;
  for (i=0; i<myValues.length; i++) {
    if (myValues[i][0] === '')
      return i+1;
  }
  return i+1;
}

copyData()用于复制你想要的数据到下一个空闲行。

这是通过使用带有 B2:B23 参数的 .getRange().copyTo 方法和带有以下参数的 .getRange() 来完成的:

  • 行:getIndexA() returns A
  • 中的第一个空单元格
  • column: 1 也就是A
  • 对应的列
  • numRows: 22 这是需要复制的行数
  • colRows: 1 这是需要复制的列数。
function copyData() {
  var sheetFrom = SpreadsheetApp.getActive().getSheetByName("Batting");
  var sheetTo = SpreadsheetApp.getActive().getSheetByName("Batsmen");
  var valuesToCopy = sheetFrom.getRange("B2:B23").getValues();

  sheetFrom.getRange("B2:B23").copyTo(sheetTo.getRange(getNextIndexA(), 1, 22, 1));
}

此外,我建议您查看以下链接,因为它们可能会有所帮助:

  1. Class Sheet Apps Script - getRange();

  2. Class Range Apps Script - copyTo().