如何使用正则表达式从URL隔离Drive文件ID?

时间:2019-06-25 04:30:14

标签: google-apps-script

我正在尝试获取仅具有Google云端硬盘URL的文件的文件名。我目前正在使用Google Sheets regexextract函数从URL中提取文件ID,然后使用脚本根据ID查找文件,但希望在脚本中进行正则表达式。

我浏览了这里的各种帖子,以期弄清运气。希望有人可以说明我在尝试使用正则表达式时做错了什么。

  var sheet = SpreadsheetApp.getActive().getSheetByName("Test1");
  var link1 = sheet.getRange("N2:N").getValues();
  var regex_ids = new RegExp("/file/d/[a-zA-Z0-9]g");
  var links = regex_ids.exec(link1);
  var filenames = []; 
  for (var i = 0; i < links.length; i++) {
    var url = links[i][0];
    if (url != "") {
      var filename = DriveApp.getFileById(links[i][0]).getName();
      filenames.push([filename]);
    }
  }
  var startRow = 2; // print in row 2 since row 1 is the header row
  var fileNameColumn = 18; // Column B = column 2
  var destination = sheet.getRange(startRow, fileNameColumn, filenames.length, filenames[0].length);
  destination.setValues(filenames);
}

当前,由于正则表达式配置不正确,我陷入了错误“ TypeError:无法从空读取属性“ length”(第7行,文件“ Code”)”。

1 个答案:

答案 0 :(得分:1)

问题/解决方案:

  • 无效的语法:

    • Regexp()接受一个正则表达式字符串和一个标志字符串作为参数,而代码提供了一个串联的正则表达式标志字符串。
    • exec()接受字符串参数,而代码提供2D数组。
  • 正则表达式不足:

    • 文件名ID也包含下划线_
    • 正则表达式应仅捕获() ID。提供的正则表达式还捕获/file/d
    • ID包含多个字符。使用+

摘要:

  var link1 = sheet.getRange("N2:N" + sheet.getLastRow()).getValues();//modified
  var regex_ids = /\/file\/d\/([^\/]+)/;//or new RegExp("/file/d/([a-zA-Z0-9_]+)","g");() =capture ids
  //var links = regex_ids.exec(link1);
  var filenames = []; 
  for (var i = 0; i < link1.length; i++) {//modified;loop through values2D array 
    var url = link1[i][0];//modified; 
    var preId = regex_ids.exec(url);//added;
    var id;
    if (preId && (id=preId[1])) {//modified; [1] = first capture group
      var filename = DriveApp.getFileById(id).getName();//modified
      filenames.push([filename]);
    } else {
      filenames.push([""]);
    }
  }

参考文献: