从 URL 列表中获取文件名 - Google Drive

Posted

技术标签:

【中文标题】从 URL 列表中获取文件名 - Google Drive【英文标题】:Get File Name from list of URL's - Google Drive 【发布时间】:2022-01-17 14:34:39 【问题描述】:

因此,我需要从电子表格中的一系列 Google Drive URL 中获取文件名列表。在网上浏览,我遇到了下面的代码。它适用,但仅适用于旧式网址,我听说 Google 在 2021 年 9 月更改了旧式网址。 注意链接不全,请替换成真实链接查看!

旧样式是: https://drive.google.com/file/d/1GMUwYxZxsNpLiaYOiVMBwl41LpreQ-fc/view?usp=sharing 这可以从下面的代码中正常工作。 我想要的是两件事。 它应该处理一系列的列,当前读取AE2:AE,并在AM2:AM 上打印出来。我想要的是通过范围:AE2:AL 并打印出:AM2:AT 其次,它还应该处理较新的表单网址: https://drive.google.com/file/d/0B9EZQqsLDEqDUGlsdy1oVEtETGs/view?usp=sharing&resourcekey=0-h7HOcxayPaHJ5r6dAAslVQ

当前代码:
    function getNames() 
  var activeRange = SpreadsheetApp.getActiveSheet().getDataRange();
  var height = activeRange.getHeight();
  var links = SpreadsheetApp.getActiveSheet()
    .getRange("AE2:AE" + height)
    .getValues();

  var nameValues = [];

  links.forEach((row) => 
    try 
      var link = row[0];
      var fileID = getIdFromLink(link);
      var name = DriveApp.getFileById(fileID).getName();
      nameValues.push([name]);
     catch (e) 
      nameValues.push(["NO NAME FOUND"]);
    
  );

  var nameRange = SpreadsheetApp.getActiveSheet().getRange("AM2:AM" + height);
  nameRange.setValues(nameValues);


function getIdFromLink(link) 
  var regex = new RegExp(
    /(?<=https:\/\/drive\.google\.com\/file\/d\/)(.+)(?=\/)/
    );
  return regex.exec(link)[0];

应该如何修改上面的代码以启用我想要的。抱歉,我尝试了几个 if/else 语句,但我的 javascript 知识非常有限。 任何帮助将不胜感激。

当前“屏幕截图”显示: (1) - 旧式 url - 正确获取文件名 (2) (3) - 新样式 url - 不拾取文件名 (4)

【问题讨论】:

捕获后为什么没有记录错误? 【参考方案1】:

只要文件没有以需要resource key 的方式共享,您的getIdFromLink() 函数应该可以正常工作。

要使用资源键,请使用DriveApp.getFileByIdAndResourceKey(),如下所示:

function getFileNamesByLink() 
  const sheet = SpreadsheetApp.getActiveSheet();
  const sourceRange = sheet.getRange('AE2:AL');
  const targetRange = sheet.getRange('AM2');
  const fileNames = sourceRange.getValues()
    .map(row => row.map(link => getFileNameFromLink_(link)));
  targetRange
    .offset(0, 0, fileNames.length, fileNames[0].length)
    .setValues(fileNames);



function getFileNameFromLink_(link) 
  if (!link) 
    return null;
  
  const fileId = getIdFromLink_(link);
  if (!fileId) 
    return NaN;
  
  let file;
  try 
    file = DriveApp.getFileById(fileId);
   catch (error) 
    try 
      file = DriveApp.getFileByIdAndResourceKey(fileId, getResourceKeyFromLink_(link));
     catch (error) 
      return NaN;
    
  
  return file.getName();



function getIdFromLink_(link) 
  const match = String(link).match(/file\/d\/([-\w]+)/i);
  return match ? match[1] : null;



function getResourceKeyFromLink_(link) 
  const match = String(link).match(/resourcekey=([-\w]+)/i);
  return match ? match[1] : null;

请注意,如果您有数千个链接,脚本可能会超时。如果发生这种情况,请以零碎的方式处理链接,或查看Advanced Drive Service 是否适合您。

【讨论】:

这是正确的。我确实注意到它超时了,所以我将按照你提到的零碎的方式完成工作。非常感谢!

以上是关于从 URL 列表中获取文件名 - Google Drive的主要内容,如果未能解决你的问题,请参考以下文章

从名称中获取 Google Sheet URL

如何从Google驱动器获取文件夹列表?

获取Google Drive演示文稿文件的链接

如何使用c#从google驱动器api获取文件夹的完整路径

从 Google Apps 脚本上的 URL 获取文件 ID 的最简单方法

从 google drive api 获取图像 URL 而不是内容