我正在测试UrlFetchApp的功能,并从Form及其电子表格传递数据。我知道可以用另一种方式做到这一点,但是我正在google脚本本身测试UrlFetchApp的功能(第一次使用它),并希望让它能够使用这种方法。
这是我得到的场景,将绑定脚本添加到表单应用程序中:
function makeRequest()
{
var webAppUrl = "https://script.google.com/macros/s/WebAppID/exec";
var auth = ScriptApp.getOAuthToken();
var header = { 'Authorization': 'Bearer ' + auth };
var options = { 'method':'post', 'headers':header };
var resp = UrlFetchApp.fetch(webAppUrl, options);
Logger.log(resp);
}
将绑定脚本添加到附加的电子表格中:
function doPost()
{
var ss = SpreadsheetApp.openById('ssID');
var name = ss.getName();
return ContentService.createTextOutput(name);
}
然后将附加到工作表的第二个脚本作为Web应用程序发布,只有我自己才能访问。
目前上面的代码不起作用。脚本的表单一侧出现以下错误:
请求失败 https://script.google.com/macros/s/WebAppID/exec 返回代码401.截断的服务器响应: 未经授权
未经授权
错误401
(使用muteHttpExceptions选项检查完整响应)(行 12,文件"代码")
UrlFetchApp代码行失败。
但是,如果我删除标题选项,然后发布Web应用程序供公众使用,这可以正常工作。显然这不是必需的。
关于我拥有的脚本之间的身份验证,我缺少什么?
附注:
任何人都知道为什么SpreadsheetApp.getActiveSheet()在以这种方式运行时不起作用?那个脚本直接绑定到谷歌表,所以很奇怪。
答案 0 :(得分:3)
好的,找到了我自己的问题的答案。真的很简单。需要将以下范围添加到我的项目中以访问电子表格:
我发现这样做的最简单方法是添加一个这样的简单函数并调用它:
function authorizeDrive()
{
var forScope = DriveApp.getRootFolder();
}
不需要返回或执行任何操作,只需从DriveApp调用任何方法即可。一旦运行,它就会弹出一个授权对话框。每次进行主要方法调用时,都不需要调用它。甚至不需要在脚本中编码。我想知道是否有办法从属性窗口简单地添加项目所需的范围(我没有找到任何)。或者也许是一种传递参数和UrlFetchApp关于需要授权的范围的方法。
购买无论如何这仍然不是太糟糕。
关于我的附注,我仍然没有找到为什么SpeadsheetApp.getActiveSheet()返回null或undefined的原因。我必须通过ID或URL打开,这很痛苦。特别是因为这是一个容器绑定脚本。还注意到Logger.log()在以这种方式运行时实际上并没有向Logger添加任何内容。如果有人还能对这两者中的任何一个有所了解,那就太棒了。
答案 1 :(得分:0)
您需要获取电子表格'首先是对象。
SpeadsheetApp.getActive().getActiveSheet()
但是,如果您要创建附加菜单,则可以使用' SpreadsheetApp.getActiveSheet()'
function myFunction() {
var lastRow = SpreadsheetApp.getActiveSheet().getLastRow();
var range = SpreadsheetApp.getActiveSheet().getRange(lastRow, 1, 1, 26);
SpreadsheetApp.setActiveRange(range);
}
function onOpen(e) {
SpreadsheetApp.getUi().createAddonMenu()
.addItem('showLastRow', 'myFunction')
.addToUi();
}