For loop 使用母版图纸中的行数据自动创建新图纸

For loop 使用母版图纸中的行数据自动创建新图纸,for-loop,google-apps-script,google-sheets,For Loop,Google Apps Script,Google Sheets,假设我有一张母版纸,名字在a列,链接在B列,从第2行开始 出于我不理解的原因,下面的代码只创建了一个第2行名称的新工作表,并在新创建的工作表中设置了第3行的值 我希望这项工作如下: 创建名称为a列的图纸 在新创建的图纸中设置A列和B列的值 有人能帮我弄清楚发生了什么事吗? 我阅读了关于循环和getRange的文档,但我搞不懂 多谢各位 function createNewSheets() { var dataSheet = SpreadsheetApp.getActiveSpreadsh

假设我有一张母版纸,名字在a列,链接在B列,从第2行开始

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

我希望这项工作如下:

  • 创建名称为a列的图纸
  • 在新创建的图纸中设置A列和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)
  }
}
函数createNewSheets(){
var dataSheet=SpreadsheetApp.getActiveSpreadsheet();
var values=dataSheet.getSheetByName('mastersheet').getRange('A2:B').getValues();
//获取包含当前游泳者姓名的工作表:
var sheet=dataSheet.getSheetByName(名称);
var col=值[i];//当前行
var swimername=col[0];//游泳者名称
//迭代“母版图纸”中的所有数据行:
对于(变量i=1;i
我相信你的目标如下

  • 您希望从“母版”工作表的“A”列和“B”列中检索值
  • 您希望使用从“mastersheet”工作表中检索到的列“A”的值作为工作表名称
  • 当激活的电子表格中不存在检索到的图纸名称的图纸时,您希望插入具有图纸名称的新图纸
  • 插入新图纸时,需要将图纸名称的同一行复制到插入的图纸
  • 您希望使用谷歌应用程序脚本实现这一点
修改点:
  • 在你的剧本里

    • var sheet=dataSheet.getSheetByName(swimername)
      swimername
      不是declaread。
      • 如果未在别处声明
        swimername
        ,则此行将发生错误
    • var col=values[i]
      处,未声明
      i
    • 在for循环中,
      • 第一个索引是
        1
        。从
        getRange('A2:B')
        ,在本例中,从第三行检索值
      • name
        col
        不会更改
  • 为了实现您的目标,我想提出以下流程

  • 检索当前图纸名称
  • 从“母版”表中检索值
  • 使用检索到的图纸名称和值,插入新图纸并放置值
当上述流程反映到脚本中时,它将变成如下所示

示例脚本:
  • 在此示例脚本中,
    sheetNames
    在循环中增长,用于检查重复的图纸名称
参考资料:

非常棒的解释,我理解你写的所有内容。不过,我的脚本的其余部分仍然有问题。我以前将两个公式声明为变量(sweeptable和fullName),我的循环中有:
sheetNames.getRange(1,3).setFormula(sweeptable)
sheetNames.getRange(“J2:J50”).setFormula(fullName)
。问题是它不再工作了。。我收到一条错误消息“TypeError:sheetNames.getRange不是函数”@Bastien Soret谢谢您的回复。我很高兴你的问题解决了。关于你的新问题,我也愿意支持你。但是,我不得不为我糟糕的英语水平道歉。不幸的是,我无法从你的回答中理解你的新问题。为了正确理解这个问题,我可以问你新问题的细节吗?通过这个,我想试着去理解它。没问题,谢谢你的帮助!在最初的代码中,我使用了两个公式。现在他们不再这样了。我应该把它们放在哪里才能工作?在你的第2点和第3点之间,我在上面的评论中声明了这两个公式。然后我将它们放在if语句中:
values.forEach(r=>{if(!sheetNames.includes(r[0]){dataSheet.insertSheet(r[0]).appendRow(r);sheetNames.push(r[0]);sheetNames.getRange(1,3).setFormula(sweetTable)sheetNames.getRange(J2:J50”).setFormula(fullName)}
我的变量如下:
//从link变量导入table='=IMPORTHTML(B1;“table”;4)//使用池大小变量fullName='连接事件(C2;“-”D2)
@Bastien Soret感谢您的回复。我不得不再次为我糟糕的英语水平道歉。关于你的新问题,我仍然无法理解你的新问题的目标和你实现新问题的问题。但我愿意支持你,并试图理解你的新问题。当我能正确地理解它时,我想想出解决办法。所以,如果你能给我一个时间来理解你的新问题,我很高兴。很抱歉,我不能很快解决你的新问题。这是因为我的技术差。我再次为此深表歉意。
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]);
    }
  });
}