How do I isolate Drive file ID from URL using regex?

巧了我就是萌 提交于 2021-01-28 11:03:31

问题


I am trying to get the file name for a file I only have the Google Drive URL for. I am currently using a Google Sheets regexextract function to extract the file ID from the URL, and then using the script to find the file based on the ID, but would prefer to do the regex within the script.

I've looked through various posts on here to try to figure it out with no luck. Hopefully someone can spell out what I have done wrong in trying to incorporate the regex.

  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);
}

Currently I am stuck with error "TypeError: Cannot read property "length" from null. (line 7, file "Code")" because the regex is not configured correctly.


回答1:


Issues/Solution:

  • Invalid Syntax:

    • Regexp() accepts a regex string and a flag string as arguments, while the code provides a concatenated regex flag string.
    • exec() accepts a string argument, while the code provides a 2D array.
  • Insufficient regex:

    • Filename IDs also contain underscores _.
    • Regex should capture() only the ID. The regex provided also captures /file/d
    • ID contains more than 1 character. Use +

Snippet:

  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([""]);
    }
  }

References:

  • Regex guide
  • Regexp#exec


来源:https://stackoverflow.com/questions/56746863/how-do-i-isolate-drive-file-id-from-url-using-regex

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!