for-loop - 使用主表中的一行数据自动创建一个新表
问题描述
考虑我有一个母版表,其中 A 列中的名称和 B 列中的链接,从第 2 行开始。
下面的代码,出于我不明白的原因,只在第 2 行创建了一个名称为的新工作表,并在新创建的工作表中设置了第 3 行的值。
我希望它按以下方式工作:
- 创建一个名为 col A 的工作表
- 在新创建的工作表中设置 col A 和 col B 的值
有人可以帮我弄清楚发生了什么吗?我阅读了有关循环和 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)
}
}
解决方案
我相信你的目标如下。
- 您想从“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
没有改变。
- 第一个索引是
- 在
为了实现您的目标,我想提出以下流程。
- 检索当前工作表名称。
- 从“mastersheet”表中检索值。
- 使用检索到的工作表名称和值,插入新工作表并放置值。
当上述流程反映到脚本时,它变成如下。
示例脚本:
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
正在循环中增长,用于检查重复的工作表名称。