【问题标题】:Google spreadsheet script works on create but doesn't any more after going offline or closing documentGoogle 电子表格脚本在创建时有效,但在离线或关闭文档后不再有效
【发布时间】:2017-02-20 15:09:44
【问题描述】:

我对脚本业务非常陌生,但我无法让自己编写的脚本正常工作。每当编辑许多其他列中的任何一个时,我都需要按列对电子表格进行排序,因此我采用了一个解决方案,我在谷歌应用程序论坛的一个封闭主题中找到了一个用户 KaseyBrown 的解决方案,这非常棒帮助(我自己无法做到这一点)。这是我的版本:

var sheetToSort = "Letras"; // name of sheet to be sorted
var columnToCheck1 = 2; // column to check for edits
var columnToCheck2 = 3; // second column to be checked for edits
var columnToCheck3 = 6;
var columnToCheck4 = 10;
var columnToCheck5 = 11;
var columnToCheck6 = 12;
var columnToCheck7 = 13;
var columnToCheck8 = 14;
var columnToSortBy = 16; // column to sort by; A = 1, B = 2, etc.
var rangeToSort = "A1:P150"; // range of values to be sorted

function onEdit(event) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var editedCell = sheet.getActiveCell();
  if (editedCell.getColumn() == columnToCheck1, columnToCheck2, columnToCheck3, columnToCheck4, columnToCheck5, columnToCheck6, columnToCheck7, columnToCheck8 && sheet.getName() == sheetToSort) {
    sortOpenCases();
  }
}

function sortOpenCases() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetToSort);
  var range = sheet.getRange(rangeToSort);
  range.sort( { column : columnToSortBy, ascending: true } );
}

问题是:脚本在创建后运行良好,并且完全按照您的需要执行,无论您想要什么,都可以进行所有编辑,直到您脱机或关闭文档。一旦你这样做了,当你返回工作表时脚本将不再工作,即使你去编辑器并再次按“运行”。不会出现错误消息。但是,如果我复制它并再次创建它,它将再次起作用……直到我再次脱机或关闭文档。 Chrome 或 Mozilla 的情况都一样。

任何想法都将不胜感激;非常感谢您抽出宝贵的时间; 胡安。

【问题讨论】:

标签: google-apps-script google-sheets offline


【解决方案1】:

您应该尝试将您的函数重命名为“onEdit”(例如“sortOnEdit”)“onEdit”是一个保留名称,将在编辑时自动触发该函数。但是这个触发器的权限是有限的。要触发您的功能,您需要从菜单“资源 > 当前项目的触发器”中设置一个触发器

建议:将通知设置为“立即”。

【讨论】:

  • Harold,这似乎解决了我描述的问题:非常感谢!然而,这种变化产生了另一种行为变化:我实际上有几个相同的脚本指向同一个文档中的不同工作表。以前,我能够让它们全部运行(直到它们不运行)。使用新的触发器设置,我创建和运行的只是最后一个。我尝试对所有脚本使用相同的触发器,并为每个脚本创建一个,使用相同的配置并且只更改名称,但两种方式我最终都只使用了我创建的最后一个。你知道为什么会这样吗?谢谢
【解决方案2】:

并非真正意义上的答案

只是对代码中逻辑的一点放大信息。

function onEdit(event) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var editedCell = sheet.getActiveCell();
  if (editedCell.getColumn() == columnToCheck1, columnToCheck2, columnToCheck3, columnToCheck4, columnToCheck5, columnToCheck6, columnToCheck7, columnToCheck8 && sheet.getName() == sheetToSort) {
    sortOpenCases();
  }
}

我不明白 if 语句中的条件发生了什么,所以我写了一个小程序来为它构建一个真值表。我在脚本编辑器中运行它,我相信这部分

if (editedCell.getColumn() == columnToCheck1, columnToCheck2, columnToCheck3, columnToCheck4, columnToCheck5, columnToCheck6, columnToCheck7, columnToCheck8

总是正确的。然后我修改了如下代码:

function do_onEdit(e) 
{
  dispStatus('Do On Edit', 'At the beginning of do_onEdit',400,200);
  var sheetToSort = "Sheet2"; // name of sheet to be sorted
  var columnToCheck1 = 2; // column to check for edits
  var columnToCheck2 = 3; // second column to be checked for edits
  var columnToCheck3 = 6;
  var columnToCheck4 = 10;
  var columnToCheck5 = 11;
  var columnToCheck6 = 12;
  var columnToCheck7 = 13;
  var columnToCheck8 = 14;
  var columnToSortBy = 16; // column to sort by; A = 1, B = 2, etc.
  var rangeToSort = "A1:P150"; // range of values to be sorted

  var sheet = SpreadsheetApp.getActiveSheet();
  var editedCell = sheet.getActiveCell();
  if (editedCell.getColumn() == columnToCheck1, columnToCheck2, columnToCheck3, columnToCheck4, columnToCheck5, columnToCheck6, columnToCheck7, columnToCheck8 && sheet.getName() == sheetToSort) 
  {
    SpreadsheetApp.getUi().alert("I'm busy sorting don't bother me.");
  }
}

在对每张工作表范围的各个列进行各种编辑之后,我不得不得出结论,唯一一次调用 sortOpenCases() 是在我更改为 Sheet2 的“sheetToSort”上进行编辑时。所以有效的 if 语句条件是:

function do_onEdit(e) 
{
  dispStatus('Do On Edit', 'At the beginning of do_onEdit',400,200);
  var sheetToSort = "Sheet2"; // name of sheet to be sorted
  var columnToCheck1 = 2; // column to check for edits
  var columnToCheck2 = 3; // second column to be checked for edits
  var columnToCheck3 = 6;
  var columnToCheck4 = 10;
  var columnToCheck5 = 11;
  var columnToCheck6 = 12;
  var columnToCheck7 = 13;
  var columnToCheck8 = 14;
  var columnToSortBy = 16; // column to sort by; A = 1, B = 2, etc.
  var rangeToSort = "A1:P150"; // range of values to be sorted

  var sheet = SpreadsheetApp.getActiveSheet();
  var editedCell = sheet.getActiveCell();
  if (sheet.getName() == sheetToSort) 
  {
    SpreadsheetApp.getUi().alert("I'm busy sorting don't bother me.");
  }
}

我使用以下代码在不同的页面和列上尝试了一系列不同的编辑:

function do_onEdit(e) 
{
  dispStatus('Do On Edit', 'At the beginning of do_onEdit',400,200);
  var sheetToSort = "Sheet2"; // name of sheet to be sorted
  var columnToCheck1 = 2; // column to check for edits
  var columnToCheck2 = 3; // second column to be checked for edits
  var columnToCheck3 = 6;
  var columnToCheck4 = 10;
  var columnToCheck5 = 11;
  var columnToCheck6 = 12;
  var columnToCheck7 = 13;
  var columnToCheck8 = 14;
  var columnToSortBy = 16; // column to sort by; A = 1, B = 2, etc.
  var rangeToSort = "A1:P150"; // range of values to be sorted

  var sheet = SpreadsheetApp.getActiveSheet();
  var editedCell = sheet.getActiveCell();
  if (editedCell.getColumn() == columnToCheck1, columnToCheck2, columnToCheck3, columnToCheck4, columnToCheck5, columnToCheck6, columnToCheck7, columnToCheck8 && sheet.getName() == sheetToSort) 
  {
    SpreadsheetApp.getUi().alert("I'm busy sorting don't bother me.");
  }
}

因此,排序仅在您在“sheetToSort”上进行编辑时发生,并且它发生在“sheetToSort”的每一列上。欢迎您使用最后一个小 sn-p 并自己测试它,因为它实际上并没有调用 sortOpenCases();

@Harold - 我学到了很多关于如何设置触发器的知识。感谢您提供信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多