如何使用 Google 脚本库跨多个工作表调用脚本的操作顺序
How to use Google Script Library to call order of operation for scripts across multiple Worksheets
我一直在尝试寻找一种方法 运行 以特定顺序跨多个工作表编写脚本。每个工作表都有自己的脚本数量 运行 当我使用它们时就很好(通过创建附加到按钮 and/or 菜单的“组合”脚本)。
脚本很多,手动检查每个脚本到 运行 个脚本效率不高。
我一直在尝试使用库,但还没有找到使其正常工作的方法。
我看过 Google Apps Script section on libraries, and relevant Whosebug threads like this one,但没弄明白。
这是我最后一次尝试(在尝试了许多不同的方法之后...)
function mastercombine() {
const west = SpreadsheetApp.openByUrl(`https://docs.google.com/spreadsheets/d/1NmN7h2wEGFlY1FatjEpJ9MRpZ_I_MtlyoApGG4F6rcw/edit#gid=589651642`);
west.West.combine();
freezeValues1();
}
我想我可能不完全理解如何调用库中的每个项目以 运行 其各自工作表上的函数。我试过用几种不同的方式调用它,但我很困惑,因为它们都给出了 null 错误。
我收到的文本错误:
TypeError: Cannot read property 'masterSheetInfo' of undefined
mastercombine @ Copy of Combined Reset.gs:5
以 west.West 开头的部分正在尝试调用库 worksheets/functions。 “west”是常量,“West”是库 ID,“combine”是 West 中的函数(运行在它自己的工作表中正确地独立存在)。
结束部分 (freezeValues1) 是一个函数,应该 运行 在当前工作表上(它可以独立工作,没有库部分)。
我最接近按特定顺序 运行 的事情是将可安装的触发器附加到每个工作表,但我无法在一小时内的某个时间 运行 " 似乎随之而来的一点。我希望通过一个触发器连续调用它们。
正在从库中调用脚本:
function combine() {
sortSheets();
SpreadsheetApp.flush();
Utilities.sleep(500);
sheetNames();
}
调用以下函数:
function sheetNames() {
var ss, list, tar;
ss = SpreadsheetApp.getActive()
list = ss.getSheets().slice(4).map(function (s, ind) {
return ['=HYPERLINK("https://docs.google.com/spreadsheets/d/1tfi_L668w7hpDqeGl84TEfVIm4zKMkyuwrKsG-uKx9A/edit#gid=' + s.getSheetId() + '", "' + s.getName() + '")'];
})
tar = ss.getSheets()[0]; //List will be written to FIRST sheet in the workbook.
tar.getRange(2, 1, tar.getLastRow(), 1).clearContent();
tar.getRange(2, 1, list.length, 1).setValues(list)
}
来自问题
The section beginning with west.West is attempting to call library worksheets/functions. "west" being the const, "West" being the Library ID, "combine" being the function within West (which runs correctly on its own within its own worksheet).
- A Google Apps 脚本库没有工作表。
west.West
不工作,因为 west
分配了一个 Class 电子表格对象,而这个 class 没有 West
property/method .因为这个 west.West
returns undefined
.
一个选项是将 West.masterSheetInfo()
转换为 参数化函数 即 West.masterSheetInfo(west)
注意:如果参数化函数,有一行像
const west = SpreadsheetApp.getActiveSpreadsheet();
可能会被
之类的东西取代
var west = west || SpreadsheetApp.getActiveSpreadsheet();
关于执行顺序,在Google Apps Scripts中,函数语句是按照编写的顺序执行的。
资源
相关
恐怕不可能
反正不是通过 Apps 脚本本身。您可以 运行 远程执行功能,但只能通过 Apps 脚本 API。
https://developers.google.com/apps-script/api/how-tos/execute
尽管这有其自身的复杂性和局限性。
即使是触发器也不会因其他脚本对 sheet 的更改而触发。所以你不能有一个实用程序 sheet 你的外部脚本可以改变一些东西并且在 sheet.
上有一个 onChange
触发器
发件人:
https://developers.google.com/apps-script/guides/triggers/installable#restrictions
Script executions and API requests do not cause triggers to run.
解决方法
为什么脚本必须存在于目标传播sheets 上?难道你不能只拥有一个包含所有代码的主脚本,然后对所有 spreadsheets 进行操作吗?
例如:
function main() {
let ssIds = [
"1b2RdsafasdfasdfE4GZy5y5465y54y54sMw",
"1b2R40ierqwerqwerf9Mvkm6I-TqE4GZsyMw",
"1b2R40iHFqqwerewqrwerkm6I-TqE4GZysMw",
"1b2R40iHFqOV7-ytqwertywerkm6I-TqGZsMw",
"1b2R40iHFqOVtryertyerf9Mvkm6I-T4GZsMw"
];
ssIds.forEach(id => {
let ss = SpreadsheetApp.openById(id);
// Do stuff here.
//...
//...
})
}
我一直在尝试寻找一种方法 运行 以特定顺序跨多个工作表编写脚本。每个工作表都有自己的脚本数量 运行 当我使用它们时就很好(通过创建附加到按钮 and/or 菜单的“组合”脚本)。
脚本很多,手动检查每个脚本到 运行 个脚本效率不高。
我一直在尝试使用库,但还没有找到使其正常工作的方法。
我看过 Google Apps Script section on libraries, and relevant Whosebug threads like this one,但没弄明白。
这是我最后一次尝试(在尝试了许多不同的方法之后...)
function mastercombine() {
const west = SpreadsheetApp.openByUrl(`https://docs.google.com/spreadsheets/d/1NmN7h2wEGFlY1FatjEpJ9MRpZ_I_MtlyoApGG4F6rcw/edit#gid=589651642`);
west.West.combine();
freezeValues1();
}
我想我可能不完全理解如何调用库中的每个项目以 运行 其各自工作表上的函数。我试过用几种不同的方式调用它,但我很困惑,因为它们都给出了 null 错误。
我收到的文本错误:
TypeError: Cannot read property 'masterSheetInfo' of undefined mastercombine @ Copy of Combined Reset.gs:5
以 west.West 开头的部分正在尝试调用库 worksheets/functions。 “west”是常量,“West”是库 ID,“combine”是 West 中的函数(运行在它自己的工作表中正确地独立存在)。
结束部分 (freezeValues1) 是一个函数,应该 运行 在当前工作表上(它可以独立工作,没有库部分)。
我最接近按特定顺序 运行 的事情是将可安装的触发器附加到每个工作表,但我无法在一小时内的某个时间 运行 " 似乎随之而来的一点。我希望通过一个触发器连续调用它们。
正在从库中调用脚本:
function combine() {
sortSheets();
SpreadsheetApp.flush();
Utilities.sleep(500);
sheetNames();
}
调用以下函数:
function sheetNames() {
var ss, list, tar;
ss = SpreadsheetApp.getActive()
list = ss.getSheets().slice(4).map(function (s, ind) {
return ['=HYPERLINK("https://docs.google.com/spreadsheets/d/1tfi_L668w7hpDqeGl84TEfVIm4zKMkyuwrKsG-uKx9A/edit#gid=' + s.getSheetId() + '", "' + s.getName() + '")'];
})
tar = ss.getSheets()[0]; //List will be written to FIRST sheet in the workbook.
tar.getRange(2, 1, tar.getLastRow(), 1).clearContent();
tar.getRange(2, 1, list.length, 1).setValues(list)
}
来自问题
The section beginning with west.West is attempting to call library worksheets/functions. "west" being the const, "West" being the Library ID, "combine" being the function within West (which runs correctly on its own within its own worksheet).
- A Google Apps 脚本库没有工作表。
west.West
不工作,因为west
分配了一个 Class 电子表格对象,而这个 class 没有West
property/method .因为这个west.West
returnsundefined
.
一个选项是将 West.masterSheetInfo()
转换为 参数化函数 即 West.masterSheetInfo(west)
注意:如果参数化函数,有一行像
const west = SpreadsheetApp.getActiveSpreadsheet();
可能会被
之类的东西取代var west = west || SpreadsheetApp.getActiveSpreadsheet();
关于执行顺序,在Google Apps Scripts中,函数语句是按照编写的顺序执行的。
资源
相关
恐怕不可能
反正不是通过 Apps 脚本本身。您可以 运行 远程执行功能,但只能通过 Apps 脚本 API。
https://developers.google.com/apps-script/api/how-tos/execute
尽管这有其自身的复杂性和局限性。
即使是触发器也不会因其他脚本对 sheet 的更改而触发。所以你不能有一个实用程序 sheet 你的外部脚本可以改变一些东西并且在 sheet.
上有一个onChange
触发器
发件人:
https://developers.google.com/apps-script/guides/triggers/installable#restrictions
Script executions and API requests do not cause triggers to run.
解决方法
为什么脚本必须存在于目标传播sheets 上?难道你不能只拥有一个包含所有代码的主脚本,然后对所有 spreadsheets 进行操作吗?
例如:
function main() {
let ssIds = [
"1b2RdsafasdfasdfE4GZy5y5465y54y54sMw",
"1b2R40ierqwerqwerf9Mvkm6I-TqE4GZsyMw",
"1b2R40iHFqqwerewqrwerkm6I-TqE4GZysMw",
"1b2R40iHFqOV7-ytqwertywerkm6I-TqGZsMw",
"1b2R40iHFqOVtryertyerf9Mvkm6I-T4GZsMw"
];
ssIds.forEach(id => {
let ss = SpreadsheetApp.openById(id);
// Do stuff here.
//...
//...
})
}