Как использовать onOpen Trigger Script для изменения поведения Google Sheet? - PullRequest
1 голос
/ 25 июня 2019

По совету кого-то ниже, я редактирую этот пост:

Моя первоначальная цель состоит в том, чтобы при открытии моего листа Google и при каждом его открытии я хотел бы получить значения нескольких проверок данных.раскрывающиеся меню, в настоящее время расположенные в ячейках A10, A15 и A20, для которых должна быть задана опция «Выбрать» - это слово в диапазоне проверки наряду с 2 другими текстовыми значениями.

У меня естьМне сообщили, что это должно быть объявлено в глобальном масштабе - но я начинающий сценарист и, честно говоря, понятия не имею, как сделать эту работу.

Любой совет будет принята с благодарностью.

function onOpen() {
    SpreadsheetApp.getActiveSheet().getRange('A10').setValue('Select');
    SpreadsheetApp.getActiveSheet().getRange('A15').setValue('Select');
    SpreadsheetApp.getActiveSheet().getRange('A20').setValue('Select');

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

После некоторого тестирования я смог заставить его работать.Как сказал Рубен, onOpen onEdit не может быть внутри любой другой функции.Они уже определяют действие, поэтому, когда действие onOpen или onEdit будет запускать сценарий автоматически при открытии или редактировании электронной таблицы.

Вы можете проверить дополнительную информацию о триггерах сценариев приложений https://developers.google.com/apps-script/guides/triggers, но вВ данном конкретном случае onEdit будет запускаться каждый раз, когда обновляется любая ячейка, если только вы не укажете ячейку, для которой хотите запустить сценарий, используя Объекты событий для получения дополнительной информации. https://developers.google.com/apps-script/guides/triggers/events.

Для этого конкретного сценария, поскольку вы хотите, чтобы сценарийзапустить при обновлении ячейки, вы должны проверить, обновляется ли эта ячейка с помощью e.range.getA1Notation (), getA1Notation () возвращает диапазон в нотации A1 для получения дополнительной информации. https://developers.google.com/apps-script/reference/spreadsheet/range#getA1Notation(). Есть пример, которыйпоможет вам понять следующий сценарий:

    function onOpen(e){

  var app = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = app.getActiveSheet();  
  sheet.getRange("A2:A2").clearContent();
  sheet.getRange("A10:A10").setValue("Select");
  sheet.getRange("A15:A15").setValue("Select");
  sheet.getRange("A20:A20").setValue("Select");
}



function onEdit(e){

  var app = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = app.getActiveSheet();
  var A2 = sheet.getRange("A2:A2");

  console.log(e.range.getA1Notation());
  if (e.range.getA1Notation() === "A2"){

    console.log("A2 Updated");
    sheet.getRange("A10:A10").setValue('Select');
  sheet.getRange("A15:A15").setValue('Select');
  sheet.getRange("A20:A20").setValue('Select');

  } 
}

функция onOpen будет запускаться каждый раз при открытии электронной таблицы, а функция onEdit будет выполняться каждый раз, когда ячейка "A2" меняет свое значение.По сути, вы проверяете, равен ли диапазон с нотацией A1 «A2», тогда он будет запускать код в операторе if, в противном случае функция будет выполнена, но не будет выполнять никаких действий, поскольку ячейка A2 по-прежнему без изменений.Делая это, я не уверен, что есть ли предел выполнения такого рода, но это то, что вы можете исследовать дальше, я не думаю, что это повлияет, так как это должно выполняться на стороне клиента, а не на стороне сервера.

Надеюсь, это поможет, привет.

2 голосов
/ 25 июня 2019

Примечание для новых читателей:

Оригинальный код вопроса был таким

 //When the sheet is opened, the contents of Cell A2 are cleared and the values in the Data Validation dropdown menus in Cells A10, A15, and A20 are set to the default "Select"


function myFunction() {
  function onOpen() {
    SpreadsheetApp.getActiveSheet().getRange('A2').clearContent();   
    SpreadsheetApp.getActiveSheet().getRange('A10').setValue('Select');
    SpreadsheetApp.getActiveSheet().getRange('A15').setValue('Select');
    SpreadsheetApp.getActiveSheet().getRange('A20').setValue('Select');
}

//When the contents of Cell A2 are edited (changed), the values in the Data Validation dropdown menus in Cells A10, A15, and A20 are set to the default "Select"


function onEdit(e) {
  var ss = SpreadsheetApp.getActive()
  var sheet = SpreadsheetApp.getActiveSheet()
  var cell = sheet.getRange('A2')
  var cellContent = cell.getValue()

  if(cellContent === (edit) {
    SpreadsheetApp.getActiveSheet().getRange('A10').setValue('Select');
    SpreadsheetApp.getActiveSheet().getRange('A15').setValue('Select');
    SpreadsheetApp.getActiveSheet().getRange('A20').setValue('Select');


  }
}

Простые триггеры не должны объявляться как локальные функции другой функции, они должны объявляться в глобальной области видимости.

Другими словами, не помещайте onOpen и onEdit внутри myFunction.


Функция в глобальной области видимости в скрипте Google Apps выглядит следующим образом:

ПРИМЕЧАНИЕ. Для простоты в onOpen кодовый блок {} включена только одна строка кода. У него может быть любое количество строк кода, выполнение которого занимает не более 30 секунд.


С другой стороны, у простых триггеров есть несколько ограничений, поэтому, возможно, вместо простых триггеров вы должны рассмотреть возможность использования устанавливаемых триггеров. Чтобы узнать о триггерах скрипта Google Apps, прочитайте https://developers.google.com/apps-script/guides/triggers

Кроме того, вы должны учитывать функции совместной работы в Google Sheets в режиме реального времени. Если один пользователь открыл электронную таблицу, а другой пользователь открыл ту же электронную таблицу, сработает простой и устанавливаемый триггер onOpen, который может изменить то, что уже отредактировал первый пользователь.

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