Javascript 如何通过自定义函数/脚本从Google Sheets中具有正确授权的文件名获取文件URL
我想创建一个自定义函数,从GoogleSheets中的文件名中提取驱动器URL 因此,使用以下代码:Javascript 如何通过自定义函数/脚本从Google Sheets中具有正确授权的文件名获取文件URL,javascript,google-apps-script,google-sheets,google-drive-api,custom-function,Javascript,Google Apps Script,Google Sheets,Google Drive Api,Custom Function,我想创建一个自定义函数,从GoogleSheets中的文件名中提取驱动器URL 因此,使用以下代码: 如果我在单元格A1中有有效的文件名 函数=getFile(A1)将返回URL 当我在脚本编辑器中运行脚本时,返回值起作用 当我在我的工作表中运行函数getFile()时,我得到下面的错误 我的代码: function getFile(cell) { var filename = encodeURI(cell); var url = "https://www.googleapis.
A1中有有效的文件名
=getFile(A1)
将返回URL
- 当我在脚本编辑器中运行脚本时,返回值起作用
- 当我在我的工作表中运行函数
时,我得到下面的错误getFile()
function getFile(cell) {
var filename = encodeURI(cell);
var url = "https://www.googleapis.com/drive/v3/files?fields=files(id,name)&q=name+contains+'" + filename + "' and trashed=false";
var params = {
method: "GET",
headers: {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
muteHttpExceptions: true
};
var res = UrlFetchApp.fetch(url, params).getContentText();
var json = JSON.parse(res);
return res; // outputs response below
if(json){
var objFiles = json.files[0];
var fileID = objFiles.id
var resURL = "https://docs.google.com/spreadsheets/d/" + fileID;
Logger.log(resURL);
//return resURL; // only works when run within script editor
}
}
错误:
"{
"error": {
"errors": [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
"
我猜我的身份证有问题。有人能告诉我如何解决这个问题吗?提前谢谢 自定义函数就像由匿名动物(用户)运行一样运行
ScriptApp.getOAuthToken
将返回不带所需作用域的匿名令牌。除非所涉及的文件是公共的,否则您所尝试的是不可能的
参考资料:
ScriptApp.getOAuthToken
将返回不带所需作用域的匿名令牌。除非所涉及的文件是公共的,否则您所尝试的是不可能的
参考资料:
- 使用PropertiesService设置并获取访问令牌
- 通过时间驱动触发器每1小时设置一次访问令牌。
- 这样,访问令牌每1小时更新一次。因为访问令牌的过期时间为1小时
- 运行自定义函数时,它使用PropertiesService获取访问令牌。
- 由此,可以使用访问令牌
修改脚本:
请将此功能安装为时间驱动触发器。当然,您可以手动运行此功能
- 的是正确的。虽然我不确定这是否是您想要的,但这种解决方法怎么样?我也经历过同样的问题。当时,我使用了以下变通方法
function setAccessToken() {
PropertiesService.getScriptProperties().setProperty("accessToken", ScriptApp.getOAuthToken());
}
在您的脚本中,请修改如下
发件人:
致:
注:
- 在这种情况下,访问令牌的所有者是项目的所有者
- 我认为这也可以被CacheService使用
- 使用PropertiesService设置并获取访问令牌
- 通过时间驱动触发器每1小时设置一次访问令牌。
- 这样,访问令牌每1小时更新一次。因为访问令牌的过期时间为1小时
- 运行自定义函数时,它使用PropertiesService获取访问令牌。
- 由此,可以使用访问令牌
修改脚本:
请将此功能安装为时间驱动触发器。当然,您可以手动运行此功能
- 的是正确的。虽然我不确定这是否是您想要的,但这种解决方法怎么样?我也经历过同样的问题。当时,我使用了以下变通方法
function setAccessToken() {
PropertiesService.getScriptProperties().setProperty("accessToken", ScriptApp.getOAuthToken());
}
在您的脚本中,请修改如下
发件人:
致:
注:
- 在这种情况下,访问令牌的所有者是项目的所有者
- 我认为这也可以被CacheService使用
- 这可能是一些需求的解决方案
我特别需要的是:循环浏览一列文件名,并以设定的间隔提取GoogleDocs URL。下面的代码只是循环遍历
“我的工作表”
的“A列”
中的文件名,并将值返回到“B列”
的相邻单元格中(从第2行开始,因为我有列标题)。我不担心安全性,因为我只引用内部组织文件
要使下面的代码正常工作,您需要:
replaceFileColumn
)replaceFileColumn()
希望这对别人有帮助
function getMyFile(cell) {
var filename = encodeURI(cell);
var files = DriveApp.getFilesByName(cell);
while (files.hasNext()) {
var file = files.next();
if(file){
var fileValue = file.getUrl();
return(fileValue);
};
};
}
function replaceFileColumn() {
var spreadsheet = SpreadsheetApp.getActive().getSheetByName('My Sheet');
var range = spreadsheet.getRange("A2:A");
var range_update = spreadsheet.getRange("B2:B");
var values = range.getValues();
for (var i = 0; i < values.length; i++) {
var fileName = values[i];
var getFileUrl = getMyFile(fileName);
values[i][0] = getFileUrl;
}
range_update.setValues(values);
}
函数getMyFile(单元格){
var filename=encodeURI(单元格);
var files=DriveApp.getFilesByName(单元格);
while(files.hasNext()){
var file=files.next();
如果(文件){
var fileValue=file.getUrl();
返回值(fileValue);
};
};
}
函数replaceFileColumn(){
var spreadsheet=SpreadsheetApp.getActive().getSheetByName(“我的工作表”);
var范围=电子表格.getRange(“A2:A”);
var range_update=spreadsheet.getRange(“B2:B”);
var values=range.getValues();
对于(变量i=0;i“我的工作表”
的“a列”
中的文件名,并将值返回到“B列”
的相邻单元格中(从第2行开始,因为我有列标题).我不担心安全性,因为我只参考内部组织文件
要使下面的代码正常工作,您需要:
function getMyFile(cell) {
var filename = encodeURI(cell);
var files = DriveApp.getFilesByName(cell);
while (files.hasNext()) {
var file = files.next();
if(file){
var fileValue = file.getUrl();
return(fileValue);
};
};
}
function replaceFileColumn() {
var spreadsheet = SpreadsheetApp.getActive().getSheetByName('My Sheet');
var range = spreadsheet.getRange("A2:A");
var range_update = spreadsheet.getRange("B2:B");
var values = range.getValues();
for (var i = 0; i < values.length; i++) {
var fileName = values[i];
var getFileUrl = getMyFile(fileName);
values[i][0] = getFileUrl;
}
range_update.setValues(values);
}