Google apps script 将数据行复制到不同的工作表

Google apps script 将数据行复制到不同的工作表,google-apps-script,Google Apps Script,我不熟悉编码/JavaScript,所以如果这个问题(无意中)措词不当,我会提前道歉。我一直在四处搜索,发现了一些类似的问题,但没有找到解决我问题的方法 我有一个场景,我有一个工作簿,其中有一张名为“数据”的表,其中包含记录和列标题。还有另一张名为“模板”的表格,其中包含一个固定模板。我需要复制数据中记录数量的模板(即,5条数据记录将创建原始模板的4份副本)。接下来,我需要将数据中的第一条记录添加到原始模板中的特定单元格区域,将数据中的第二条记录添加到第一个模板副本中相同的特定单元格区域,等等

我不熟悉编码/JavaScript,所以如果这个问题(无意中)措词不当,我会提前道歉。我一直在四处搜索,发现了一些类似的问题,但没有找到解决我问题的方法

我有一个场景,我有一个工作簿,其中有一张名为“数据”的表,其中包含记录和列标题。还有另一张名为“模板”的表格,其中包含一个固定模板。我需要复制数据中记录数量的模板(即,5条数据记录将创建原始模板的4份副本)。接下来,我需要将数据中的第一条记录添加到原始模板中的特定单元格区域,将数据中的第二条记录添加到第一个模板副本中相同的特定单元格区域,等等

我已经将我的脚本设置到可以复制模板表并将所有记录拉入数组的位置,但是我还没有弄清楚如何将第一条记录设置为原始模板,将第二条记录设置为第二个模板,等等。非常感谢您的帮助

function duplicate() {

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');

var startRow = 2; //first row
var lastRow = sheet.getLastRow();

var StartCol = 1
var LastCol = sheet.getLastColumn()

var numCol = sheet.getLastColumn();
var numRows = sheet.getLastRow(); // Number of rows to process

var dataRange = sheet.getRange(startRow, StartCol, numRows, numCol);
var data = dataRange.getValues(); 

//Duplicate Sheet based on # of Records 
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName("Template"); 
for (i=1;i<numRows;++i) s.copyTo(ss).setName("Template "+i);

//A bad attempt at trying to add the records to each template copy
var nextSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Template "+i);
nextSheet.getRange(lastRow+1,1,numRows,numCol).setValues(data[0+1]);
}
函数复制(){
var sheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
var startRow=2;//第一行
var lastRow=sheet.getLastRow();
var StartCol=1
var LastCol=sheet.getLastColumn()
var numCol=sheet.getLastColumn();
var numRows=sheet.getLastRow();//要处理的行数
var dataRange=sheet.getRange(startRow、StartCol、numRows、numCol);
var data=dataRange.getValues();
//基于#个记录的重复表
var ss=SpreadsheetApp.getActiveSpreadsheet();
var s=ss.getSheetByName(“模板”);

对于(i=1;i我不确定您到底想要什么,但我认为这会给您带来积极的推动

function duplicate() {

var ss=SpreadsheetApp.getActiveSpreadsheet()
var sheet=ss.getSheetByName('Data');

var startRow = 2; //first row
var lastRow = sheet.getLastRow();

var StartCol = 1
var LastCol = sheet.getLastColumn()

var numCol = sheet.getLastColumn();
var numRows = sheet.getLastRow()-startRow+1; // Number of rows to process

var dataRange = sheet.getRange(startRow, StartCol, numRows, numCol);
var data = dataRange.getValues(); 

//Duplicate Sheet based on # of Records 

var s = ss.getSheetByName("Template"); 
for (i=0;i<numRows;++i) 
{
  s.copyTo(ss).setName("Template " + Number(i+1));
  s.getRange(startRow,startCol,numRows,numCol).setValues(data);
}
}
函数复制(){
var ss=SpreadsheetApp.getActiveSpreadsheet()
var sheet=ss.getSheetByName('Data');
var startRow=2;//第一行
var lastRow=sheet.getLastRow();
var StartCol=1
var LastCol=sheet.getLastColumn()
var numCol=sheet.getLastColumn();
var numRows=sheet.getLastRow()-startRow+1;//要处理的行数
var dataRange=sheet.getRange(startRow、StartCol、numRows、numCol);
var data=dataRange.getValues();
//基于#个记录的重复表
var s=ss.getSheetByName(“模板”);

对于(i=0;i如果我理解正确,您希望每个数据记录[行]都有自己的工作表,基于
模板
,将单个记录插入每个记录的单独工作表的相同单元格范围

function duplicate() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Data");
  // Get the Template sheet
  var template = ss.getSheetByName("Template"); 

  var startRow = 2; //first row
  var lastRow = sheet.getLastRow();

  var StartCol = 1;
  var LastCol = sheet.getLastColumn();

  var numCol = sheet.getLastColumn();
  var numRows = sheet.getLastRow(); // Number of rows to process

  var dataRange = sheet.getRange(startRow, StartCol, numRows, numCol);
  var data = dataRange.getValues(); 

  // The constant single column range to insert the data record into
  var data_insert_range = sheet.getRange("C14:C22").getA1Notation();

  // For each data record create a new sheet based on the template
  // and insert into a pre-set range
  data.forEach(function (e,i) {
    var nextSheet = ss.insertSheet("Template Copy " + i, {template: template});
    // Map each col of the record into it's own row
    var dataRowIntoCol = e.map(function (c) { return [c] });
    // Insert record into the desired column
    nextSheet.getRange(data_insert_range).setValues(dataRowIntoCol);
  });
}
与其使用模板来复制和覆盖数据,我建议保持
模板
的纯净,并创建新的工作表来从中写入数据。如果没有,只需将
copyTo()
放回
insertSheet()
的位置,它也会这样工作


编辑:更新代码以反映澄清的范围/数据信息

对于随机部分,这非常有效,但我遇到了一个新问题。数据插入范围值设置为A4:I4。我实际上需要数据填充到C14:C22中的每个新表中。我尝试将数据插入范围修改为C14:C22,但收到以下error:“不正确的范围高度,是1,但应该是9”。我假设我需要转置数组元素,但不知道如何实际转置(并让整个脚本继续工作)。用A1表示法,其中一条数据记录的范围是多少?“data!A2:I2”是第一条记录,而“data!A3:I3”是第二条记录。“data!A1:I1”是标题行。每个记录将插入到C14:C22中的每个模板中。更新的代码可将记录行更改为列并插入到所需的范围中。如果数据在某一点上的列数超过或少于9列,则必须更新
数据插入范围
。错误“范围高度不正确”这意味着
setValues()
试图插入一个包含9行的记录谢谢!我认为理想情况下,我应该将getRange设置为起始行/列,而不是C14:C22,但这非常有效!谢谢,我得到了一个getValues(对象)即使在更正StartCol案例后也会出现错误,并且不知道从哪里开始,因为我不确定它为什么没有读取数据。另一个答案是(随机部分)复制工作表/按需要插入数据,但它只是将其插入错误的位置。Oops。我使用了getValues()而不是setValues()。这可能会有所不同。但您的原始代码对确定您想要的东西没有多大帮助。因此,您可能需要稍微调整一下。