通过其他电子表格中的脚本导入新数据时自动触发器不起作用
Automatic trigger not working when new data imported through script in other spreadsheet
问题
我有以下脚本。手动触发时它的作用是:
- 正在用 A 列中每个人的姓名创建新的 sheets
- 在新创建的sheet中添加一行A列和B列的数据
- 对以下问题没有影响的其他内容
当我设置内置触发器时,它根本不起作用。
我已经测试过的
在我看来,重要的是要知道此传播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 的方法可能更简单并且适合您的情况。所以我提出来了。
参考文献:
问题
我有以下脚本。手动触发时它的作用是:
- 正在用 A 列中每个人的姓名创建新的 sheets
- 在新创建的sheet中添加一行A列和B列的数据
- 对以下问题没有影响的其他内容
当我设置内置触发器时,它根本不起作用。
我已经测试过的
在我看来,重要的是要知道此传播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 的方法可能更简单并且适合您的情况。所以我提出来了。