Есть ли способ запустить две функции одновременно в Google Apps Script с одной функцией в виде бесконечного цикла? - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть две функции, которые я хочу запускать одновременно, но я не могу просто позволить им запускаться отдельно, поскольку одна функция содержит бесконечный цикл while(true).И проблема с JavaScript состоит в том, что если вам нужно запустить две функции, он завершит выполнение функции перед запуском следующей;поэтому, если я запускаю функцию с циклом while(true), она никогда не перейдет к следующей функции, а если я выполню цикл while(true), загрузка первой функции займет много времени, поэтому она потеряет цель бесконечного цикла.
Если вы все еще не понимаете, вот мой код:

function onOpen(){           // Google Apps Script trigger
    infLoop()
    runScript()
}

function ingLoop(){

    while(True){
        Utilities.sleep(100)
        DocumentApp.getActiveDocument()
        .setname("dont change this name")
    }
}

function runScript(){
    //code...
}

Ответы [ 3 ]

2 голосов
/ 24 сентября 2019

Сценарий Google Apps выполняется синхронно.По большей части одновременная / параллельная обработка невозможна.Судя по вашему сценарию, вам кажется, что вы хотите, чтобы две функции выполнялись одновременно на Open.Возможные обходные пути (некоторые не проверены):

Обходное решение № 1: Использование различных проектов

  • Создание нового проекта: В редакторе> Файл> Создать> Проект
  • Запустится onOpen() первого проекта infLoop()
  • Запустится onOpen() второго проекта runScript()
  • Обе функции будут запускаться одновременно при открытии.

Обходной путь № 2: Простой и устанавливаемый триггер 1

  • Создание устанавливаемого триггера дляrunScript()
  • Простой триггер onOpen() будет работать infLoop()
  • Обе функции будут работать одновременно при открытии.
  • Вы можете использовать два устанавливаемых триггера вместо простого и устанавливаемого триггера.

Обходной путь № 3: Веб-приложения: вызов с клиента

  • Если открыта боковая панель или открыт лист из веб-приложения,можно повторно вызывать функции сервера через google.script.run (которые работают асинхронно)

Обходной путь # 4: Веб-приложения: UrlFetchApp # fetchAll 2

  • UrlFetchApp # fetchAll выполняется асинхронно
  • После публикации веб-приложения опубликованный URL-адрес можно использовать с параметрами запроса.Если имя функции отправляется в качестве параметра и doGet() выполняет функцию, .fetchAll может использоваться для нескольких функций асинхронно.

Обходной путь # 5: onEdit / onChange

  • Если выполняется редактирование, обе функции (onEdit / onChange) запускаются одновременно.

Обходной путь # 6: API листов / onChange

  • Если надстройка / скрипт вносит изменения в листы API, onChange может получить срабатывание.При срабатывании каждое изменение, внесенное с использованием api листов, вызывает асинхронный запуск onChange.
2 голосов
/ 23 сентября 2019

Чтобы запустить две или более функции «одновременно», вы должны вызывать каждую функцию отдельно.Одним из способов является использование обещаний из кода на стороне клиента.

Имейте в виду, что бесконечный цикл на стороне сервера в конечном итоге приведет к тому, что ваш сценарий превысит максимальное время выполнения (6 минут / 30 минут)в зависимости от типа учетной записи, который использует эффективный пользователь).

Связано

1 голос
/ 23 сентября 2019

Выполнение бесконечного цикла в скрипте Apps бесполезно, поскольку для большинства сценариев принудительное максимальное время выполнения составляет 6 минут .Когда вы достигнете этого предела, выполнение сценария будет прервано.

Судя по вашему примеру сценария, вы пытаетесь выполнить запланированное задание для задания имени документа. Для этой цели вам лучше будет использовать управляемый временем триггер .

Затем вы можете структурировать свой скрипт так:

function onOpen() {
    // code...
}

function updateDocumentName() {
    DocumentApp.getActiveDocument().setName("dont change this name")
}

Затем вы можете настроить управляемый по времени триггер , связанный с функцией updateDocumentName().

Одно важное отличие, на которое следует обратить внимание: вместо выполнения логики каждые 100 мс, самая высокая частотаможно установить с помощью спускового механизма, запускаемого по времени, один раз в 1 минуту.

...