Вставка сна в определенную функцию в скрипте Google Sheets

Я пытаюсь извлечь данные из стороннего API и вставить их в Google Таблицы. Однако эта третья сторона разрешает только 3 запроса в минуту, поэтому я пытаюсь использовать функцию Utilities.sleep внутри функции, которую я создаю для этого запроса.

Мой лист выглядит так:

У него есть два входа, необходимых для функции, которую я использую (это ниже):

function GET_DETAILS_RECEITA(CNPJ,sleep_seconds) {
  Utilities.sleep(sleep_seconds*1000);

  var fields = 'nome,fantasia,email,telefone';
  var baseUrl = 'https://www.receitaws.com.br/v1/cnpj/';
  var queryUrl = baseUrl + CNPJ;

  if (CNPJ == '') {
    return 'Give me CNPJ...';
  }

  var response = UrlFetchApp.fetch(queryUrl);
  var json = response.getContentText();
  var place = JSON.parse(json);

  return [[ place.nome,
            place.fantasia,
            place.telefone,
            place.email,
          ]];
}

Технически это должно работать, но по какой-то причине я получаю возврат только в первом.

введите здесь описание изображения

Ошибка, которую я получаю, очень общая: «Ошибка: Erro interno ao executar a função personalizada». (что-то вроде "Ошибка: Внутренняя ошибка при выполнении персонализированной функции").

Любые идеи?


person aabujamra    schedule 04.12.2018    source источник
comment
Вам определенно понадобится явный контроль над использованием API, который ограничивает вас до 3/мин. Пользовательские функции не предоставляют вам необходимых инструментов.   -  person tehhowch    schedule 04.12.2018


Ответы (2)


Из https://developers.google.com/apps-script/guides/sheets/functions

Вызов пользовательской функции должен вернуться в течение 30 секунд. Если это не так, в ячейке будет отображаться ошибка: Внутренняя ошибка при выполнении пользовательской функции.

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

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

person Rubén    schedule 04.12.2018
comment
на самом деле я использую это в редакторе сценариев. должен ли этот тайм-аут, а? - person aabujamra; 04.12.2018
comment
@abutremutante Пожалуйста, проверьте developers.google.com/apps-script/guides/services/ квоты - person Rubén; 04.12.2018

Я бы подумал об использовании чего-то подобного в диалоге. Вы можете передать дополнительный параметр в заданном интервале, если используете Chrome.

<script>
var CNPJ='what ever';
window.onload=function(){setInterval(getDetails,25000,CNPJ);}
function getDetails(CNPJ){
  google.script.run.GET_DETAILS_RECEITA(CNPJ)
}
</script>

И если вам нужен обратный вызов, используйте withSuccessHandler();

person Cooper    schedule 04.12.2018