如何生成工作表副本,每次使用循环更改单元格值?

时间:2019-01-18 14:57:19

标签: google-apps-script google-sheets

我对这种Drivesheets并不陌生,但它很棒!我曾经与Excel和Vba一起工作过,很高兴看到这个全新的世界。

这是我的问题:在Excel中,我的文件带有“模板”。该模板链接到根据单元格值而变化的数据。例如,在单元格K26中有一个密钥号;如果其值为1,则模板将向您显示与1相关的信息。如果是2,它将向您显示与2相关的信息,依此类推。这里有一个我要生成的数字列表,所以当我运行代码时,模板将添加一个新工作表,复制其当前值并将其粘贴到新工作表中,将该工作表从“ SheetX”重命名为单元格的值K26,然后继续下一行。

问题:我想在驱动器表中做同样的事情,但不知道如何开始。

我的模板工作表称为“ Generador”,当前注册表在单元格K26中(这也是工作表的名称)。我要复制的范围是从A1I67。如果可能,我希望有一个新的工作簿,并在此工作簿中创建列表的所有工作表。该列表可以在“列表”表中的任何位置。

谢谢。

编辑:

到目前为止,我的代码: 基于this

function createEmployeeSheets() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
   // Get the range of cells that store employee data.
  var ssLista = ss.getSheetByName("Lista");
  var rgEData = ssLista.getRange(2,1);
  var eData=rgEData.getValue();//número de registros
  var employeeDataRange = ssLista.getRange(2,1,eData,1);//Nombres de hoja empezando en columna 1 desde fila 2
  var employeeObjects = employeeDataRange.getValues();
  var template = ss.getSheetByName('Generador');

  for (var i=0; i < employeeObjects.length; i++) {
     // Put the sheet you want to create in a variable
     var sheet = ss.getSheetByName(employeeObjects[i]);
      // Check if the sheet you want to create already exists. If so,
      // log this and loop back. If not, create the new sheet.
        if (sheet) {
           Logger.log("Sheet " + employeeObjects[i] + "already exists");
        } else {
           template.getRange("K3").offset(0,0).setValue(employeeObjects[i]);
           template.copyTo(ss).setName(employeeObjects[i]);

           }
        }
  return;

  i = 0;
}

我设法生成了每个工作表,更改了模板值的K3并将其重命名。我缺少两件事:

我仍然遇到一个错误:当代码开始生成工作表时,它继续进行,并没有停止在“列表”工作表的最后一行。例如,我有3个带有值的行,当循环进入4个行时,它显示错误行,因为它无法命名空白(空)。

另一件事是我想在新工作簿中而不是在当前工作簿中生成工作表。有没有办法可以在一个新表中创建这些表?考虑到信息是与公式链接的,因此应该仅是值。

谢谢。

1 个答案:

答案 0 :(得分:0)

尝试一下:

getValues()函数返回2D数组Objec [] []

function createEmployeeSheets() {
  var ss = SpreadsheetApp.getActive();
  var shLista = ss.getSheetByName('Lista');
  var rgEData = shLista.getRange(1,3);
  var eData=rgEData.getValue();//the number of names I think
  var employeeDataRange = ssLista.getRange(2,1,eData,1);//Sheet names in column1 starting from row2
  var employeeObjects = employeeDataRange.getValues();//sheet names in column 0
  var template=ss.getSheetByName('Generador');//template
  for (var i=0;i< employeeObjects.length; i++) {
    if(!ss.getSheetByName(employeeObjects[i][0])){
      template.getRange("K3").setValue(employeeObjects[i][0]);
      var sheet=ss.insertSheet(employeeObjects[i][0], {template:template});
    }
  }
}

此代码未经测试。