当前位置: 首页 > 知识库问答 >
问题:

如何通过同一电子表格中的多个工作表测试基于时间的触发器?[闭门]

程钧
2023-03-14

首先,我创建了一个基于时间的触发器,每天在凌晨1点到2点之间运行。我需要这个触发器来每次跨多个工作表运行一个函数,而不需要创建额外的函数。我想我已经基本上弄清楚了,但是我在没有运行触发器的情况下测试它,然后等到第二天看它是否工作时遇到了问题。有没有一种方法可以测试触发器,而不必为我所做的每一个更改等待24小时?

其次,当我点击run onfunction shellFunction(){时,它似乎没有运行我在函数运行期间需要运行的函数,即function dateChange(){。我知道dateChange()函数工作正常,至少在活动工作表上是这样。我需要帮助弄清楚为什么它不会运行dateChange()运行脚本时的函数。

我的代码

ScriptApp.newTrigger("dateChange")
    .timeBased()
    .atHour(1)
    .everyDays(1)
    .create();

function shellFunction() {
  var sheets = ['Screening','Maint - PrePress','Vulcan','Sullivan','Packing','Materials','Shipping','Labels','Embroidery','Pad Print','Quality'];
  for (var s in sheets) {
    toTrigger(sheets[s]);
  }
}

function toTrigger(sheets) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName(sheets);
}

function dateChange() {
  var sss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = sss.getSheets()[0];

  // Move all filled columns one to the right
  var columnSpec = sss.getRange("D1:NG1");
  columnSpec.moveTo(sss.getRange("E1:NH1"));
  
  // Auto-fill to the column the new date is needed in
  sheet.getRange('H1:M1').activate();
  sheet.getActiveRange().autoFill(sheet.getRange('M1:C1'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
 
}

到目前为止,我所使用的参考资料如下:

https://developers.google.com/apps-script/guides/triggers/installable

https://developers.google.com/apps-script/reference/script/clock-trigger-builder

如何在同一电子表格中的多个工作表上自动运行google脚本

共有2个答案

上官凯歌
2023-03-14

1.如文档所述-除了everyDas(n)之外,还有一些方法,如everyHours(n)或everyMinutes(n),允许您更频繁地触发触发器

  • 所以出于测试目的,删除当前触发器(例如,通过继续编辑-
  • 然后通过UI创建一个新触发器:
  • 或者通过编程与
ScriptApp.newTrigger("dateChange")
  .timeBased()
  .everyMinutes(1)
  .create();

这是为了测试目的-一旦您验证了您的脚本工作-删除分钟触发器并以相同的方式重新安装每日触发器。

2.要理解为什么你的函数不执行

  • 在函数的不同部分实现日志,然后继续查看-

带有日志的示例函数:

function dateChange() {
  Logger.log("testlog at the beginning");
  var sss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = sss.getSheets()[0];
  
  // Delete C column and then reinsert blank C Column
  //sheet.deleteColumn(3);
  //sheet.insertColumnsBefore(3,1)
  
  // Move all filled columns one to the right
  var columnSpec = sss.getRange("D1:NG1");
  columnSpec.moveTo(sss.getRange("E1:NH1"));
  Logger.log("testlog after moving");
  
  // Auto-fill to the column the new date is needed in
  sheet.getRange('H1:M1').activate();
  sheet.getActiveRange().autoFill(sheet.getRange('M1:C1'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
  Logger.log("testlog after autofill");  
}

示例执行日志:

云新知
2023-03-14

有没有一种方法可以测试触发器,而不必等待24小时等待我所做的每一次更改?

答案很简单。时间触发器负责及时运行函数。该函数的运行方式与手动运行完全相同。因此,您可以通过选择该函数并执行来测试函数是否工作,并查看是否得到了所需的结果。如果是,那么您可以设置一个时间触发器来为您执行该函数。

我需要这个触发器每次跨多个工作表运行一个函数

>

dateChange有两个问题。首先,由于sss,它仅适用于电子表格文件中的第一张工作表。getSheets()[0] 以及这部分代码将针对活动工作表sss执行。getRange(“D1:NG1”) 可能不是工作表中的第一张工作表。此外,无论如何,这不是推荐的方法。既然您有要使用的特定图纸,为什么要在活动图纸上运行?

代码的一般问题:

>

  • 不要使用活动范围,只需获取范围并使用它。您不希望看到正在发生的更改,尤其是考虑到您希望通过时间触发器(而不是手动)执行脚本。

    您将触发器创建部分定义为全局操作,该操作将在您运行该脚本中的任何函数时执行。建议将此操作包装在函数中。

    您只需要两个函数。一个将负责创建触发器,另一个将是在所选图纸上运行的主要功能。

    当您迭代地与工作表和设置值等交互时,最好刷新挂起的工作表更改。

    function createTrigger(){
    ScriptApp.newTrigger("dateChange")
        .timeBased()
        .atHour(1)
        .everyDays(1)
        .create();
    }
    
    function dateChange() {
      var sss = SpreadsheetApp.getActiveSpreadsheet();
      var sheets = sss.getSheets();
      var sheet_names = ['Screening','Maint - PrePress','Vulcan','Sullivan','Packing',
                         'Materials','Shipping','Labels','Embroidery','Pad Print','Quality'];
      
      sheets.forEach(sheet=>{               
      if(sheet_names.includes(sheet.getName())){
        // Move all filled columns one to the right
        var columnSpec = sheet.getRange("D1:NG1");
        columnSpec.moveTo(sheet.getRange("E1:NH1"));  
        // Auto-fill to the column the new date is needed in
        const rng = sheet.getRange('H1:M1');
        rng.autoFill(sheet.getRange('M1:C1'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
        SpreadsheetApp.flush();    
      }                                               
      }); 
    }
    

    >

  • 要设置触发器,请仅执行一次createTrigger功能:

    如果您想测试时间触发器是否工作,请手动执行dateChange,看看您是否在工作表中获得了所需的结果。

  •  类似资料:
    • 我是天然气新手,我写了一个脚本来进行价格比较,它基本上得到产品的价格,储存它们,每天通过基于时间的触发器检查价格是否发生变化,如果价格发生变化,发送电子邮件,如果没有变化,什么也不做。 所以现在我陷入困境,我想在电子表格中添加更多的工作表,我需要在所有工作表中运行相同的脚本,但我不知道如何管理它。 据我所知,现在我的脚本是基于这个功能运行的 “var ss=SpreadsheetApp.getAc

    • 因此,如果输入条件是TRUEFALSEFALSETRUEFALSE,那么有没有什么方法可以同时触发第一个规则和第二个规则,并在列表中返回结果,在本例中,第一个操作是APPROVERTWO和APPROVERFOUR。

    • 我很难找到关于如何设置onEdit触发器的好资源。我有一个只想在编辑特定工作表时运行的函数。例如,假设我有表1、表2、表3、表4、表5。我的脚本从工作表2、3、4中提取数据并填充工作表1。我只希望在有人编辑工作表2、3或4时运行脚本。如何设置此触发器?

    • 对于包含多个工作表的电子表格,我有一个脚本,可以在按下按钮时删除特定范围内所有工作表中的数据。 现在我有一个主电子表格,它链接到其他几个电子表格(以及它们包含的工作表)(导入范围、查询等)。)。 是否可以通过脚本在连接的电子表格中按一个按钮删除特定范围内的数据,我想从主电子表格中触发此操作?! 使用脚本从工作表中删除的数据是手动用户输入的,因此不来自主电子表格。表1中应删除的范围/单元格不同。A和

    • 我有一个谷歌电子表格,有两张叫做罗宾和露西的表格。每次我向列A添加一些数据时,我都制作/找到/破坏了一个脚本来对工作表上的数据进行排序 这个剧本很棒,但我只想把它应用在第一张纸上,罗宾。第二个工作表中的数据,Lucy,是不一样的,所以我将创建另一个脚本为不同的范围,一旦我得到了这个问题的头脑。 我想我需要使用getSheetByName(“罗宾”),但我似乎无法让它工作。提前感谢

    • 查看GoogleSheetsAPI,似乎很容易将行附加到现有的电子表格(这里有文档记录)。 我不知道如何做的是在包含多个工作表的电子表格中的特定工作表中追加一行。工作表似乎有自己的ID(这里记录了),但是追加操作调用了一个。附加到包含多个工作表的电子表格似乎总是附加到电子表格中当前的“第一个”工作表。 有人知道如何使用API/SDK请求将行附加到特定工作表中吗?