Loops 谷歌脚本-在电子表格中自动创建新工作表后,在预定义的单元格中设置公式

Loops 谷歌脚本-在电子表格中自动创建新工作表后,在预定义的单元格中设置公式,loops,google-apps-script,google-sheets,foreach,google-sheets-formula,Loops,Google Apps Script,Google Sheets,Foreach,Google Sheets Formula,假设我有一张母版纸,名字在a列,链接在B列,从第2行开始。 我希望在母版图纸中添加的每一行自动: 创建在A列中包含人员姓名的新工作表 在新创建的图纸中设置A和B的值 在C中设置我的导入公式 设置J2:J50中的连接公式 要点1。二,。我们工作得很好。第3点。四,。根本不工作,我会收到这样一条错误消息:TypeError:sheetNames.getRange不是函数 我不知道这有什么问题,但我很确定这是我把它们放在循环中的地方或其他地方造成的 有人能帮我吗 function createNewS

假设我有一张母版纸,名字在a列,链接在B列,从第2行开始。 我希望在母版图纸中添加的每一行自动:

  • 创建在A列中包含人员姓名的新工作表
  • 在新创建的图纸中设置A和B的值
  • 在C中设置我的导入公式
  • 设置J2:J50中的连接公式
  • 要点1。二,。我们工作得很好。第3点。四,。根本不工作,我会收到这样一条错误消息:TypeError:sheetNames.getRange不是函数

    我不知道这有什么问题,但我很确定这是我把它们放在循环中的地方或其他地方造成的

    有人能帮我吗

    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('Liste de nageurs');
      var values = masterSheet.getRange('A2:B' + masterSheet.getLastRow()).getValues();
    
      // Imports table from link
      var swimmerTable = '=IMPORTHTML(B1;"table";4)'
      // Concatenates event with pool size
      var fullName = 'CONCATENATE(C2;" - ";D2)'
    
      // 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]);
    
          // Sets the formula in the 3rd column:
          sheetNames.getRange(1, 3).setFormula(swimmerTable)
    
          // Sets the formula2 and iterates it from row 2 to row 50
          sheetNames.getRange("J2:J50").setFormula(fullName)
        }
      });
    }
    
    试试这个:

      const fullName = '=C2 & " - " & D2)';
          // ...
          const sheet = dataSheet.insertSheet(r[0]).appendRow(r);
          // ...
          sheet.getRange(1, 3).setFormula(swimmerTable);
          sheet.getRange("J2:J50").setFormula(fullName);
    
    可能的解决办法 我认为错误在这里:

    dataSheet.insertSheet(r[0]).appendRow(r);
    sheetNames.push(r[0]);
    //在第3列中设置公式:
    sheetNames.getRange(1,3).setFormula(可游泳)
    //设置公式2并将其从第2行迭代到第50行
    sheetNames.getRange(“J2:J50”).setFormula(全名)
    
    既然你说你收到的错误是

    TypeError:sheetNames.getRange不是函数

    这似乎是因为变量
    sheetNames
    可能如下所示:

    ["sheet1", "sheet2", ...]
    
    这些只是“字符串”(纯文本),而不是图纸对象。所以他们没有方法
    getRange

    您可以将其更改为:

    var newSheet=dataSheet.insertSheet(r[0])
    sheetNames.push(r[0]);
    新闻纸.附录行(r);
    newSheet.getRange(1,3).setFormula(可编辑)
    newSheet.getRange(“J2:J50”).setFormula(全名)
    
    在这里,您将
    dataSheet.insertSheet
    的返回值分配给一个变量。此方法的返回值是新的图纸对象

    总而言之,我相信在您的代码中,您将工作表名称(即文本)的概念与具有
    getRange
    方法的工作表对象混为一谈

    参考文献

    谢谢您的回答。遗憾的是,我不明白你的建议。在哪里插入?它在改变什么?什么是常数?答案中的每一行都替换了问题中类似的一行
    const
    类似于
    var
    ,但可以防止意外的重新分配。看,非常感谢!当你解释它的时候,它看起来很简单,最重要的是,它工作得很好。