首页 > 解决方案 > 使用主表中的一行数据自动创建一个新表

问题描述

考虑我有一个母版表,其中 A 列中的名称和 B 列中的链接,从第 2 行开始。

下面的代码,出于我不明白的原因,只在第 2 行创建了一个名称为的新工作表,并在新创建的工作表中设置了第 3 行的值。

我希望它按以下方式工作:

有人可以帮我弄清楚发生了什么吗?我阅读了有关循环和 getRange 的文档,但我无法弄清楚..

非常感谢你

function createNewSheets() {
  var dataSheet = SpreadsheetApp.getActiveSpreadsheet();
  var values = dataSheet.getSheetByName('mastersheet').getRange('A2:B').getValues();
  
  // Get sheet with current swimmer name:
  var sheet = dataSheet.getSheetByName(swimmerName);

  var col = values[i]; // Current row
  var swimmerName = col[0]; // swimmer name

  // Iterate through all rows of data from "mastersheet":
  for (var i = 1; i < values.length; i++) {

    // Check if sheet with current swimmer name exists. If it doesn't it creates it:
    if (!sheet) {
      sheet = dataSheet.insertSheet(swimmerName);
    }
    
    // Sets current row of data to the new sheet:
    sheet.getRange(1, 1, col.length, col[0].length).setValues(col)
  }
}

标签: for-loopgoogle-apps-scriptgoogle-sheets

解决方案


我相信你的目标如下。

  • 您想从“mastersheet”表中的“A”和“B”列中检索值。
  • 您想使用从“mastersheet”工作表中检索到的“A”列的值作为工作表名称。
  • 当检索到的工作表名称的工作表在活动电子表格中不存在时,您希望插入具有工作表名称的新工作表。
  • 插入新工作表时,您希望将工作表名称的同一行复制到插入的工作表中。
  • 您想使用 Google Apps 脚本实现此目的。

修改点:

  • 在你的脚本中,

    • var sheet = dataSheet.getSheetByName(swimmerName),swimmerName未声明。
      • swimmerName没有在别处声明时,在这一行发生错误。
    • var col = values[i],i未声明。
    • 在 for 循环中,
      • 第一个索引是1。从getRange('A2:B'),在这种情况下,值是从第 3 行检索的。
      • swimmerName并且col没有改变。
  • 为了实现您的目标,我想提出以下流程。

    1. 检索当前工作表名称。
    2. 从“mastersheet”表中检索值。
    3. 使用检索到的工作表名称和值,插入新工作表并放置值。

当上述流程反映到脚本时,它变成如下。

示例脚本:

function createNewSheets() {
  // 1. Retrieve the current sheet names.
  var dataSheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetNames = dataSheet.getSheets().map(s => s.getSheetName());

  // 2. Retrieve the values from "mastersheet" sheet.
  var masterSheet = dataSheet.getSheetByName('mastersheet');
  var values = masterSheet.getRange('A2:B' + masterSheet.getLastRow()).getValues();

  // 3. Using the retrieved sheet names and values, the new sheets are inserted and the values are put.
  values.forEach(r => {
    if (!sheetNames.includes(r[0])) {
      dataSheet.insertSheet(r[0]).appendRow(r);
      sheetNames.push(r[0]);
    }
  });
}
  • 在此示例脚本中,sheetNames正在循环中增长,用于检查重复的工作表名称。

参考:


推荐阅读