通过其他电子表格中的脚本导入新数据时自动触发器不起作用

Automatic trigger not working when new data imported through script in other spreadsheet

问题

我有以下脚本。手动触发时它的作用是:

当我设置内置触发器时,它根本不起作用。

我已经测试过的

在我看来,重要的是要知道此传播sheet 中 A 列和 B 列中的数据是由于另一个传播sheet 中的另一个脚本而导入的。它为什么如此重要 ?因为如果我在更改或编辑时设置内置触发器并手动添加一行,它会像手动触发时一样完美地触发我的内置触发器。

条件

最后要解释的是,我不想要一个强制我进行手动操作以使其工作的“解决方案”。我需要它自动工作,而不是使用某种复选框或其他东西。

有人能解决这个问题吗? 非常感谢帮助我解决这个问题。

代码

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])) {
      var newSheet = dataSheet.insertSheet(r[0])
      sheetNames.push(r[0]);
      newSheet.appendRow(r);

      // Sets the formula in the 3rd column:
      newSheet.getRange(1, 3).setFormula(swimmerTable)

      // Sets the formula2 and iterates it from row 2 to row 50
      newSheet.getRange("J2:J50").setFormula(fullName)
    }
  });
}

我相信你的现状和你的目标如下。

  • 您有 2 个 Spreadsheet“A”和“B”,每个 Spreadsheet 都有容器绑定脚本。

  • Spreadsheet“A”脚本如下

      function exportDataNageurs() {
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var values = ss.getSheetByName('Nageurs').getRange('A2:B').getValues();
        var dataSheet = SpreadsheetApp.openById("###");
        var targetSheet = dataSheet.getSheetByName("Liste de nageurs");
        targetSheet.getRange(2, 1, values.length, values[0].length).setValues(values);
      }
    
  • The Spreadsheet "B" 在你的问题中有 createNewSheets() 的脚本。

  • 当 Spreadsheet "A" 的脚本 exportDataNageurs() 为 运行 并将值放入 Spreadsheet "B", 你想自动运行 Spreadsheet "B"的脚本createNewSheets().

  • 您想使用触发器实现此目的。

问题和解决方法:

当我看到你的 exportDataNageurs() 脚本时,这些值是使用 Spreadsheet service 和 SpreadsheetApp 放置的。不幸的是,在这种情况下,即使将值放入 Spreadsheet“B”,也不会触发 OnChange 触发器。这是 Google 端的当前规范。

为了在使用脚本将值放入 Spreadsheet“B”时触发 OnChange 触发器,我想使用 Sheets API 而不是 Spreadsheet服务。这样,当使用 Sheets API 将值放入 Spreadsheet "B" 时,可以触发 OnChange 触发器。

用法:

1。 Spreadsheet "A".

的修改脚本

请修改exportDataNageurs()如下。在使用此脚本之前,please enable Sheets API at Advanced Google services。并且,请设置Spreadsheet ID。

function exportDataNageurs() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var values = ss.getSheetByName('Nageurs').getRange('A2:B').getValues();
  var spreadsheetId = "###"; // Please set the Spreadsheet ID.
  Sheets.Spreadsheets.Values.update({values: values}, spreadsheetId, "'Liste de nageurs'!A2", {valueInputOption: "USER_ENTERED"});
}

2。将 OnChange 触发器安装到 Spreadsheet "B".

请将 OnChange 触发器安装到函数 createNewSheets() at Spreadsheet "B"。 Ref

3。测试中。

OnChange触发器安装到createNewSheets() at Spreadsheet "B"后,请运行脚本exportDataNageurs() at Spreadsheet "A ”。通过这种方式,值被放入 Spreadsheet“B”的 sheet“Liste de nageurs”和 运行 脚本 createNewSheets().

我认为在您的脚本中 createNewSheets(),可能不需要使用事件对象。

注:

  • 作为另一种方法,我认为使用部署到 Spreadsheet "B" 的 Web 应用程序,当 exportDataNageurs() 为 运行 时,您的目标也可以通过以下方式实现从脚本 exportDataNageurs() 请求 Web 应用程序。此外,该功能还可以 运行 使用 Google Apps 脚本 API。但我认为上述使用 Sheets API 的方法可能更简单并且适合您的情况。所以我提出来了。

参考文献: