【问题标题】:Loop function on Apps Scripts & Google Natural Language APIApps Scripts 和 Google Natural Language API 上的循环功能
【发布时间】:2020-05-10 10:28:38
【问题描述】:

如果这太基础了,我正在学习如何编码,很抱歉,但我在这里遇到了麻烦:

我一直在尝试调用 Google Natural Language API,以向我提供有关我的 Google 电子表格的 210 行信息的信息(整个表格有 211 行)。我想将结果保存在 1 个 Json 文件中。

我正在尝试使用下面的代码运行一个循环,但我得到的 Json 文件仅包含与第一行对应的信息。也尝试将“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);

}

【问题讨论】:

  • 我可以假设您的请求有效,并且超过 200 个到 https://language.googleapis.com/v1beta2/documents:analyzeEntities 的请求有效吗?
  • 是的,你为什么要问?你有什么问题吗?
  • 感谢您的回复。关于why do you ask? Did you have any problem?,我无法测试请求。所以我问了他们。对此我深表歉意。
  • 没问题,伙计!我问是因为我可以帮忙:)
  • 感谢您的回复。您的请求有效,超过 200 个到 language.googleapis.com/v1beta2/documents:analyzeEntities 的请求有效,没有错误。如果我的理解是正确的,我可以问一下您期望的样本结果吗?我认为需要创建一个包含 JSON 对象的数组。这个怎么样?而datavar data = JSON.parse(response); 是一个JSON 对象?在正确了解您的情况和目标后,我想考虑解决方案。对此我深表歉意。

标签: javascript google-apps-script google-sheets google-natural-language


【解决方案1】:

我建议您代替您正在采用的方法(使用for 循环和方法getValue(),这是一种在循环中调用的慢速方法),考虑一下我给您的这个代码:

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 次循环更快。我还建议您检查:

  • Apps Script Quotas:按你的方式运行你的代码,它会让你有更多的机会达到这些配额。

  • Best Practices:您可以查看有关最佳实践的更多信息,以便更好地了解我为什么告诉您避免循环使用 getValue() 方法。

【讨论】:

    猜你喜欢
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多