Функция цикла в скриптах приложений и API естественного языка Google

Я учусь программировать, извините, если это слишком просто, но у меня тут проблемы:

Я пытался вызвать Google Natural Language API, чтобы получить информацию о 210 строках моей электронной таблицы Google (вся таблица содержит 211 строк). Я хотел бы сохранить результаты в 1 файле Json.

Я пытаюсь запустить цикл с приведенным ниже кодом, но получаю файл Json только с информацией, соответствующей 1-й строке. Пытался также поместить строку кода Driveapp.createFile внутрь функции цикла, но потом у меня есть много файлов Json, каждый с информацией, соответствующей одной строке. И я бы хотел 1 файл Json с соответствующей информацией о 210 строках.

Буду признателен за вашу помощь, пожалуйста.

    function analyzeText() {


  var client = "Spreadsheet_ID";
  var query = SpreadsheetApp.openById(client).getSheetByName("1. Template");
 var result = SpreadsheetApp.openById(client).getSheetByName("Teste - Natural Language API");
 var lrow = query.getLastRow();

  for(var i=2; i<=211;i++)
  {
  var text = query.getRange(i,211).getValue()

  var requestUrl = [
    'https://language.googleapis.com/v1beta2/documents:analyzeEntities?key=',
    'API_KEY_XXXXXXXXXXXXXXXXXXX'
  ].join("");


  var data = {
    "document": {
      "language": "en-us",
      "type": "PLAIN_TEXT",
      "content": text
    },
    "encodingType": "UTF8"
  };

  var options = {
    method : "POST",
    contentType: "application/json",
    payload : JSON.stringify(data)
  };

  var response = UrlFetchApp.fetch(requestUrl, options);

  var data = JSON.parse(response);

  }
 DriveApp.createFile('response3.json', response, MimeType.PLAIN_TEXT);

}

person Luís Correia    schedule 10.05.2020    source источник
comment
Могу ли я предположить, что ваш запрос работает, а запросы более 200 на https://language.googleapis.com/v1beta2/documents:analyzeEntities работают без ошибок?   -  person Tanaike    schedule 11.05.2020
comment
Да, почему вы спрашиваете? Были ли у вас проблемы?   -  person Luís Correia    schedule 11.05.2020
comment
Спасибо за ответ. Насчет why do you ask? Did you have any problem?, проверить запрос не могу. Я спросил о них. Я глубоко извиняюсь за это.   -  person Tanaike    schedule 11.05.2020
comment
Нет проблем, дружище! Я спрашивал, потому что мог помочь :)   -  person Luís Correia    schedule 11.05.2020
comment
Спасибо за ответ. Ваш запрос работает, и более 200 запросов к language.googleapis.com/v1beta2/documents:analyzeEntities работает без ошибок. Если я правильно понимаю, могу ли я спросить вас о результатах пробы, которые вы ожидаете? Я считаю, что необходимо создать массив, включающий объект JSON. Как насчет этого? А data из var data = JSON.parse(response); - это объект JSON? Я хотел бы подумать о решении после того, как смогу правильно понять вашу ситуацию и цель. Прошу прощения за это.   -  person Tanaike    schedule 11.05.2020


Ответы (1)


Я бы предложил вам вместо того подхода, который вы принимаете (с использованием цикла for и метода _ 2_, медленный метод вызова в цикле), рассмотрите этот метод, который я даю вам с помощью этого кода:

function analyzeText() {
  var clientId = "your-sheet-id";
  var ss =  SpreadsheetApp.openById(clientId);
  var templateSheet = ss.getSheetByName("1. Template");
  // .getRange(row, column, numRows) -> From the first row and col, take the next 4 rows
  // Modify these arguments depending in where you want to start and how many rows you want
  var data = templateSheet.getRange(1, 1, 4).getValues();
  // You will get an array 2D, using join you will able to get an string from
  // all the elements in that array
  var text = data.join();
  var requestUrl = [
    'https://language.googleapis.com/v1beta2/documents:analyzeEntities?key=',
    'API_KEY_XXXXXXXXXXXXXXXXXXX'
  ].join("");
  // Now text will have all your cell values and you only need to do one request
  var data = {
    "document": {
      "language": "en-us",
      "type": "PLAIN_TEXT",
      "content": text
    },
    "encodingType": "UTF8"
  };
  var options = {
    method : "POST",
    contentType: "application/json",
    payload : JSON.stringify(data)
  };
  var response = UrlFetchApp.fetch(requestUrl, options);
  var data = JSON.parse(response);
  DriveApp.createFile('response3.json', response, MimeType.PLAIN_TEXT);
}

Таким образом, вам нужно сделать только один запрос, и он будет быстрее, чем выполнение цикла в 211 раз. Я также рекомендую вам проверить:

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

  • Лучшие практики: вы можете узнать больше о передовых методах, чтобы вы можете лучше понять, почему я говорил вам избегать использования метода getValue() в цикле.

person alberto vielma    schedule 11.05.2020