通过工作表中的“编辑器”与“按钮”调用时,脚本的行为有所不同

时间:2019-06-21 13:44:07

标签: javascript google-apps-script urlfetch

因此,我编写了一个对URL“ https://beatsaver.com/api/maps/detail/”执行HTTPRequest的脚本。从脚本编辑器内部调用并在不调试的情况下运行它,整个过程就可以很好地工作。

当我使用调试模式或通过将脚本功能绑定到我正在处理的工作表中的按钮(预期的方式)来激活脚本功能时,就会出现我遇到的问题。

正常运行时,它将返回正常的HTTP响应,我可以使用该响应。在执行上述操作时,它会返回

  

错误500:内部服务器错误。

我正在将内部UrlFetchApp.fetchAll方法与我之前创建的一些HTTPrequest对象一起使用。删除标题部分是我尝试解决的问题,因为在非调试模式下运行时缺少标题。这没有帮助。

感谢您的帮助。感谢您:)

记录器(非调试/不删除标题):

[19-06-21 15:40:21:285 CEST] {method=get, payload=, followRedirects=true, validateHttpsCertificates=true, useIntranet=false, contentType=null, url=https://beatsaver.com/api/maps/detail/28a}

记录器(调试/不删除标题):

[19-06-21 15:40:38:316 CEST] {headers={X-Forwarded-For=x.x.x.x(ip address)}, method=get, payload=, followRedirects=true, validateHttpsCertificates=true, useIntranet=false, contentType=null, url=https://beatsaver.com/api/maps/detail/28a}

代码:

var urlsArray = urlRange.getValues();
  var urls = Array();

  // loop to create array of beatsaver api links to fetch later 
  for(var index = 0; index < urlsArray.length; index++){    

    var currentValue = urlsArray[index][0];
    // break condition if no more urls found
    if(currentValue == ""){
      break;
    }
    var url = "";

    // TODO add check if really is URL
    if(currentValue.length < 5){
      // field is ID of song
      url = "https://beatsaver.com/api/maps/detail/" + currentValue;
    } else if(currentValue.indexOf("https://beatsaver.com/beatmap/") == 0){      
      // field is real URL      
      url = currentValue.replace("/beatmap/","/api/maps/detail/");
    } else {
      //skip this line
      Logger.log("Skipped line" + (index + 4));
      continue;
    }    

    var request = UrlFetchApp.getRequest(url);    
    // delete request.headers;
    Logger.log(request);

    urls.push(request);
  } 

// here the error gets thrown when using debugging/button
var response = UrlFetchApp.fetchAll(urls);

编辑: 该API还具有一个rateLimit,我不想通过访问fetchAll(希望)来触发。

编辑2: 我实施了建议的更改,整个过程仍然无法正常工作。键是具有3-4位十六进制键的数组,该键附加到原始网址后。

以下是代码段:

doGet:

function doGet(e){
  var url = "https://beatsaver.com/api/maps/detail/" + e.parameter['key'];
  var res = UrlFetchApp.fetch(url);
  Logger.log(res);
  return ContentService.createTextOutput(res.getContentText());
}

调用Web应用程序(使用开发Web URL进行测试):

for(var i = 0; i < keys[coloumn].length; i++){
      var url = "https://script.google.com/macros/s/AKfycbwovggRuY4eRgBYdMxwXlXEblqM8CuYoOT41qhXACE/dev?key=" + keys[coloumn][i];
      var res = UrlFetchApp.fetch(url);
      Logger.log(res.getContentText());
      var jdata = JSON.parse(res.getContentText());

}

0 个答案:

没有答案