Как удалить действия, предпринятые триггером onEdit, из списка истории отмен в Google Sheets и App Scripts - PullRequest
0 голосов
/ 02 мая 2019

На одном из моих листов я использую простой скрипт для изменения границ некоторых ячеек при каждом редактировании.

Это выглядит примерно так:

function onEdit(e) {
    ...
    sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).setBorder(null, null, null, null, false, false);
    sheet.getRangeList(rangeList).setBorder(null, null, true, null, false, false, "#BBDEFB", SpreadsheetApp.BorderStyle.SOLID_THICK);
  }
}

Все работает хорошо, однако, после редактирования чего-либо, скажем, я нажимаю CMD + Z (или CTRL + Z), чтобы отменить мое последнее действие. На самом деле происходит то, что добавленная граница удаляется, потому что технически это было последним действием.

Есть ли известное решение проблем такого рода?

Edit: Я создал функцию ручного запуска на основе первого ответа. Тем не менее, Google Sheets имеет ограничение в один триггер на пользователя для каждой таблицы. Таким образом, границы были изменены только один раз. Я также удалил триггер, как он сказал, и даже тогда он не работал.

Кроме того, есть ли лучший способ сделать это? Установка границ равными нулю при каждом редактировании практически исключает возможность добавления пользовательских границ.

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Если мое понимание правильное, как насчет этого обходного пути?Пожалуйста, подумайте об этом как об одном из нескольких обходных путей.

Когда электронная таблица модифицируется извне, даже если были нажаты клавиши CMD + Z (или CTRL + Z), измененное действие нельзя отменить.В этом обходном пути я использовал это.

Модифицированный скрипт:

Прежде чем использовать этот скрипт, , пожалуйста, установите функцию sample() как триггер события OnEdit. Таким образомКогда вы редактируете ячейку, автоматически запускается функция sample().Вы можете увидеть, как установить триггер на здесь .

function sample(e) {
  if (e.source.getActiveSheet().getSheetName() == "Sheet1") {
    var sheet = SpreadsheetApp.openById(e.source.getId()).getSheetByName("Sheet1"); // Modified
    var values = sheet.getRange(3, 3, sheet.getLastRow() - 1, 1).getValues();
    var rangeList = values.reduce(function(ar, e, i) {
      if (i > 0 && (values[i - 1][0] != e[0] && e[0] != "")) {
        ar.push("A" + (i + 2) + ":P" + (i + 2));
      }
      return ar;
    }, [])
    rangeList.push(sheet.getRange(sheet.getLastRow(), 1, 1, sheet.getLastColumn()).getA1Notation());
    sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).setBorder(null, null, null, null, false, false);
    sheet.getRangeList(rangeList).setBorder(null, null, true, null, false, false, "black", SpreadsheetApp.BorderStyle.SOLID_THICK);
  }
}

Примечание:

  • Когда вы используете этот скрипт, пожалуйста, переименуйте функцию onEdit(e) к другому имени, как onEdit_sample(e).Поскольку в сценарии есть onEdit(), запускаются оба sample(), установленные как триггер OnEdit, и onEdit().Пожалуйста, будьте осторожны.

Ссылки:

Если я неправильно понял ваш вопрос, прошу прощения.

Редактировать:

По вашему дополнительному запросу я добавил пример сценария для установки триггера события OnEdit дляфункция sample().

Пример сценария:

var id = SpreadsheetApp.getActiveSpreadsheet().getId();
ScriptApp.newTrigger("sample").forSpreadsheet(id).onEdit().create();
1 голос
/ 06 мая 2019

Если вам не нужны мгновенные изменения форматирования, попробуйте настроить основанный на времени триггер программно для запуска каждые X минут.

Может представлять интерес создание пользовательских параметров меню «Лист» для включения / выключения этого автоматического мониторинга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...