如何使用 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).

  1. A Google Apps 脚本库没有工作表。
  2. 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.
    //...
    //...
  })
}