将数据行复制到不同的表格

时间:2017-08-14 02:20:14

标签: google-apps-script

我是编码/ JavaScript的新手,所以如果这个问题(无意中)表达不当,我会提前道歉。我一直在寻找并发现了一些类似的问题,但没有解决我的问题。

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

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

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

2 个答案:

答案 0 :(得分:1)

我不确定你想要什么,但我认为这会给你带来积极的推动。

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

答案 1 :(得分:1)

如果我理解正确,您希望每个数据记录[行]都有自己的工作表,基于Template,单个记录插入到每个记录的相同单元格范围内片

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

我建议不要使用模板来复制和覆盖数据,而是建议保持Template纯,并创建用于从中写入数据的新工作表。如果没有,只需将copyTo()放回insertSheet()代替var input1 = document.createElement("input"); var input2 = document.createElement("input"); var input3 = document.createElement("input"); input1.setAttribute("type","checkbox"); input2.setAttribute("type","checkbox"); input3.setAttribute("type","checkbox"); var br = document.createElement("br"); var text1 = document.createTextNode("option1"); var text2 = document.createTextNode("option2"); var text3 = document.createTextNode("option3"); var se = document.getElementById("container"); input1.appendChild(text1); input2.appendChild(text2); input3.appendChild(text3); se.appendChild(input1); se.appendChild(br); se.appendChild(input2); se.appendChild(input3);,它也会以这种方式运作

编辑:更新了代码以反映明确的范围/数据信息