将不连续的选定行从电子表格复制到另一个电子表格



使用此脚本可以将选定的行从电子表格复制到另一个电子表格,从列C复制到列E。
当脚本终止时,在;源";电子表格中,H列中显示所复制行的值sent

问题是脚本采用连续范围内选定的行,因此不可能复制不连续的选定行

如何解决此问题?

function main() {
transfer("....", "Foglio1", "Foglio1");
}
function transfer(targetId, sourceSheetName, targetSheetName) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = ss.getSheetByName(sourceSheetName);
var last = sourceSheet.getActiveRange().getRow();
var height = sourceSheet.getActiveRange().getHeight();  
var data = sourceSheet.getRange(last, 3, height, 3).getValues();
// copy data
var ss2 = SpreadsheetApp.openById(targetId);
var targetSheet = ss2.getSheetByName(targetSheetName);
//get last row
var lastRow = targetSheet.getLastRow();
//write data
targetSheet.getRange(lastRow + 1, 3, data.length, data[0].length)
.setValues(data);

sourceSheet.getRange(last, 8, height).setValue('Sent');
}

我相信你的目标如下。

  • 您想要复制列"C";至";E〃;使用Google Apps脚本将源工作表中所选行的一个或多个行映射到目标工作表
  • 当复制值时,您希望将";发送";到列";H〃;在源工作表中
  • 在您的情况下,选定的行不仅是连续的行,而且是离散的行

修改点:

  • 在这种情况下,为了检索所选范围,我建议使用getActiveRangeList()和spreadsheets.values.batchGet-inSheetsneneneba API方法。
    • 我认为电子表格服务也可以实现您的目标。但我认为当使用Sheets API时,工艺成本会很低。因此,在这个答案中,我想提出使用Sheets API的方法
  • 为了将";发送";,我使用了范围列表

当以上几点反映到您的脚本中时,它变成如下。

修改的脚本:

在这种情况下,transfer()被修改。在使用此脚本之前,请在高级Google服务中启用Sheets API。

function transfer(targetId, sourceSheetName, targetSheetName) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = ss.getSheetByName(sourceSheetName);

// --- I modified below script.
var ranges = sourceSheet.getActiveRangeList().getRanges().reduce((o, r) => {
var row = r.getRow();
var numRows = r.getNumRows();
o.getValues.push(`${sourceSheetName}!C${row}:E${row + numRows - 1}`);
o.setValue.push(`${sourceSheetName}!H${row}:H${row + numRows - 1}`);
return o;
}, {getValues: [], setValue: []});
var data = Sheets.Spreadsheets.Values.batchGet(ss.getId(), {ranges: ranges.getValues}).valueRanges.reduce((ar, v) => ar.concat(v.values), []);

data = data.map(r => !r ? Array(3).fill("") : (r.length < 3 ? r.concat(Array(3 - r.length).fill("")) : r));  // Added by OP's 3rd question in the comment.
// ---

// copy data
var ss2 = SpreadsheetApp.openById(targetId);
var targetSheet = ss2.getSheetByName(targetSheetName);
//get last row
var lastRow = targetSheet.getLastRow();
//write data
targetSheet.getRange(lastRow + 1, 1, data.length, data[0].length).setValues(data);  // Modified by OP's 2nd question in the comment.
sourceSheet.getRangeList(ranges.setValue).setValue('Sent');  // Modified
}
  • 在这种情况下,可以使用连续行和离散行
  • 选择离散行时,在此示例中,选择的顺序就是值的顺序。请小心

参考文献:

  • getActiveRangeList((
  • 方法:spreadsheets.values.batchGet
  • getRangeList(a1符号(

除了Tanaike提出的优雅解决方案外,为了完成任务,我想添加一个简单的解决方案:

  • 您正在定义var height = sourceSheet.getActiveRange().getHeight();

  • 方法getHeight((返回(相邻(范围的高度。

  • 相反,如果您想复制所有范围,直到最后一个数据包含行(包括空行(,您可以定义:

    var height = sourceSheet.getActiveRange().getLastRow() - last + 1;

  • 现在,您将选择并复制活动选择的行和最后一个包含数据的行之间的所有行,包括其间的空行。

  • 请注意,对于大量数据,Tanaike的解决方案将更加高效。

相关内容

最新更新