Как изолировать идентификатор файла диска от URL с помощью регулярных выражений? - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь получить имя файла, для которого у меня есть только URL-адрес Google Диска. В настоящее время я использую функцию регулярного выражения Google Sheets для извлечения идентификатора файла из URL, а затем использую сценарий для поиска файла на основе идентификатора, но предпочитаю выполнять регулярное выражение в сценарии.

Я просмотрел различные посты здесь, чтобы попытаться разобраться без удачи. Надеюсь, кто-то может объяснить, что я сделал неправильно, пытаясь включить регулярное выражение.

  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, файл" Код ")", поскольку регулярное выражение настроено неправильно.

1 Ответ

1 голос
/ 25 июня 2019

Вопросы / Решение:

  • Неверный синтаксис:

    • Regexp() принимает строку регулярного выражения и строку флага в качестве аргументов, в то время как код предоставляет объединенную строку флага регулярного выражения.
    • exec() принимает строковый аргумент, а код предоставляет двумерный массив.
  • Недостаточное регулярное выражение:

    • Идентификаторы имени файла также содержат подчеркивание _.
    • Регулярное выражение должно () захватывать только ID. Регулярное выражение также захватывает /file/d
    • ID содержит более 1 символа. Используйте +

Отрывок:

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

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...