首页 > 解决方案 > 我需要帮助开发一个谷歌脚本来生成一个产品列表

问题描述

我对谷歌脚本非常熟悉,但我正在尝试构建一个项目,该项目将:

  1. 在工作表 A(图像中的粉红色单元格)的列表中获取 2 个输入(名称和项目编号),然后将它们复制/粘贴到工作表顶部的特定 2 个单元格范围(图像中的绿色单元格)。这些值在作为我的产品模板的工作表(蓝色单元格)的前 4 行上生成输出。我确实为这些单元格创建了命名范围。我认为... 图片 ->我的“SheetA”图片
  2. 在工作表 B 的顶部插入 4 行。 *这是工作表 B的图像

  3. 从工作表 A 的前 4 行复制这些新值,并将它们粘贴到工作表 B 上新插入的行中。

  4. 重复

我一直在尝试自己构建功能,但我非常缺乏经验。我真的只是想学习,所以如果你能帮助我理解任何能让我更接近完成这项工作的东西,我将非常感激!

到目前为止,这是我的代码:

function onOpen() {
  var spreadsheet = SpreadsheetApp.getActive();
  var menuItems = [
    {name: 'Prepare sheet...', functionName: 'prepareSheet_'},
    {name: 'Generate products...', functionName: 'generateProduct_'}
  ];
  spreadsheet.addMenu('Directions', menuItems);
}

function generateProduct_() {
    var i = 0
    var generatorCells = nameCell + ":" + numberCell;
    var nameCell = new String("A"+i);
    var numberCell = new String("B"+i);
    var generatorCells = nameCell + ":" + numberCell;
    var nameCellResults = new String("A"+(i*5));
    var numberCellResults = new String("B"+(i*5));
    for (var i=11;CELL_EMPTY = false; i++) {
  spreadsheet.getRange(generatorCells).copyTo(getRange(productGenCells)), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false;
  spreadsheet.getRange('2:5').copyTo(sheet.getRange(genResults),{contentsOnly:true}, spreadsheetApp.CopyPasteType.PASTE_VALUES, true);
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Results'), true);
   spreadsheet.getActiveSheet().insertRowsBefore(spreadsheet.getActiveRange().getRow(), 4);
  spreadsheet.getActiveRange().offset(0, 0, 1, spreadsheet.getActiveRange().getNumColumns()).activate();
  spreadsheet.getRange('productGen!2:5').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('productGen'), true);
  spreadsheet.getRange('2:2').activate();
  }
};

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


如果你通过https://jshint.com/(或类似的)运行你的代码,它会发现很多问题。下面的一些更正的代码。但最明显的问题是 for 循环中的条件测试。

1)首先使用单个 =(赋值)运算符而不是双 ==(测试) 2)在循环中未设置应该为 CELL_EMPTY 测试的值。3)无论如何,这应该是一个while循环。

function onOpen() {
  var spreadsheet = SpreadsheetApp.getActive();
  var menuItems = [
    {name: 'Prepare sheet...', functionName: 'prepareSheet_'},
    {name: 'Generate products...', functionName: 'generateProduct_'}
  ];
  spreadsheet.addMenu('Directions', menuItems);
}

function generateProduct() {
    var i = 0;
    var nameCell = "A"+i;
    var numberCell = "B"+i;
    var generatorCells = nameCell + ":" + numberCell;
    var nameCellResults = "A"+(i*5);
    var numberCellResults = "B"+(i*5);
    for (i=11;CELL_EMPTY == false; i++) {
        spreadsheet.getRange(generatorCells.copyTo(getRange(productGenCells)), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
          spreadsheet.getRange('2:5').copyTo(sheet.getRange(genResults),{contentsOnly:true}, spreadsheetApp.CopyPasteType.PASTE_VALUES, true);
          spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Results'), true);
          spreadsheet.getActiveSheet().insertRowsBefore(spreadsheet.getActiveRange().getRow(), 4);
          spreadsheet.getActiveRange().offset(0, 0, 1, spreadsheet.getActiveRange().getNumColumns()).activate();
          spreadsheet.getRange('productGen!2:5').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
          spreadsheet.setActiveSheet(spreadsheet.getSheetByName('productGen'), true);
          spreadsheet.getRange('2:2').activate();
        }
}

推荐阅读