【问题标题】:Google Script - Setting formulas in pre-defined cells after automatically creating a new sheet in a spreadsheetGoogle Script - 在电子表格中自动创建新工作表后在预定义的单元格中设置公式
【发布时间】:2021-04-18 16:57:28
【问题描述】:

假设我有一个 masterSheet,名称在 A 列,在 B 列有一个链接,从第 2 行开始。 我希望在 masterSheet 中添加的每一行都自动添加:

  1. 创建在 A 列中包含人员姓名的新工作表
  2. 在这个新创建的工作表中设置 A 和 B 的值
  3. 在 C 中设置我的 IMPORTRANGE 公式
  4. 在 J2:J50 中设置我的 CONCATENATE 公式

第 1 点和第 2 点运行良好。第 3 点和第 4 点根本不起作用,我收到一条类似这样的错误消息:TypeError: sheetNames.getRange is not a function

我无法弄清楚这有什么问题,但我很确定它来自我将它们放入循环或其他东西的地方。

有人可以帮我解决这个问题吗?

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)
    }
  });
}

【问题讨论】:

    标签: loops google-apps-script google-sheets foreach google-sheets-formula


    【解决方案1】:

    可能的解决方案

    我相信错误就在这里:

    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)
    

    既然你说你收到的错误是

    TypeError: sheetNames.getRange is not a function

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

    ["sheet1", "sheet2", ...]
    

    这些只是“字符串”(纯文本)而不是工作表对象。所以他们没有getRange这个方法。

    您可以将其更改为:

    var newSheet = dataSheet.insertSheet(r[0])
    sheetNames.push(r[0]);
    
    newSheet.appendRow(r);
    
    newSheet.getRange(1, 3).setFormula(swimmerTable)
    newSheet.getRange("J2:J50").setFormula(fullName)
    

    在这里,您将dataSheet.insertSheet 的返回值分配给一个变量。该方法的返回值是新的工作表对象。

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

    参考

    【讨论】:

    • 非常感谢!当你解释它时看起来很简单,最重要的是,它工作得很好。
    【解决方案2】:

    试试这个:

      const fullName = '=C2 & " - " & D2)';
          // ...
          const sheet = dataSheet.insertSheet(r[0]).appendRow(r);
          // ...
          sheet.getRange(1, 3).setFormula(swimmerTable);
          sheet.getRange("J2:J50").setFormula(fullName);
    

    【讨论】:

    • 感谢您的回答。很遗憾,我不明白你的提议。在哪里插入?它在改变什么?什么是常量?
    • 答案中的每一行都替换了问题中的相似行。 constvar 类似,但可防止意外重新分配。见MDN
    猜你喜欢
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多