Javascript 如何通过自定义函数/脚本从Google Sheets中具有正确授权的文件名获取文件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.

我想创建一个自定义函数,从GoogleSheets中的文件名中提取驱动器URL

因此,使用以下代码:

  • 如果我在单元格
    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行开始,因为我有列标题)。我不担心安全性,因为我只引用内部组织文件

                要使下面的代码正常工作,您需要:

              • 谷歌工作表文档导航>工具>脚本编辑器
              • 创建一个.gs文件并在下面输入代码(参考相应的工作表
              • 在脚本编辑器>编辑>当前项目的触发器>命名项目中
              • 在脚本编辑器>编辑>当前项目的触发器>单击模式链接“未设置触发器。单击此处立即添加一个”>设置基于时间的触发器(在该模式的选择字段中,参考
                replaceFileColumn
              • 我的错误是:认为我需要在每个单元格中使用一个自定义函数来实现这一点(我仍然不完全理解auth为什么这不起作用,所以如果有人能用外行的话来解释这一点,那将是难以置信的;我的解决方案只是权宜之计而已)

                在我的电子表格中,我有一个调用
                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这可能是一些需求的解决方案

                我特别需要的是:循环遍历一列文件名,并以设定的间隔拉取Google Docs URL。下面的代码只是循环遍历
                “我的工作表”
                “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);
                }