无法从文件名中获取和设置提取 - 使用getName()的regexextract()。

问题描述 投票:0回答:1

第一次发帖;在脚本方面很生疏;到处找不到解决以下问题的办法,我想这是最基本的......

在一个G表中,我需要创建一个G-Drive文件夹中所有文件的列表。在这个列表中,每个文件都要用包含在每个文件名中的项#来标记;这些项#遵循一致的字符模式(如AB123A),可以用regex'[a-zA-Z]{2}[0-9]{3}[a-zA-Z]'来描述。文件可以这样命名。

"Merch Bin 1 - CC554A - 3.15.20"
"AB101C - Web"

我已经开始用下面的脚本从文件夹中按顺序获取文件名,并设置在第1列的空行中,但我不知道如何修改它,使之只从文件名中提取#项&并据此设置。

function listitems(){
 var ss=SpreadsheetApp.getActiveSheet(); 
 var folder=DriveApp.getFolderById(‘Folder ID');
 var contents=folder.getFiles();
 var file;
 var item;
 while(contents.hasNext()){
    file=contents.next();
    item=file.getName(); //Assume this is where to apply any regex extract functionality to extract the item # from the file name
    ss.appendRow([item]); //Intended to set item #'s extracted from file names to col.1 of 1st empty row
 }
}

感谢任何帮助&指导。

google-apps-script
1个回答
2
投票

所以,从你建议的匹配条件开始。[a-zA-Z]{2}[0-9]{3}[a-zA-Z]

你需要声明一个新的变量。var re =new RegExp("[a-zA-Z]{2}[0-9]{3}[a-zA-Z]");

在循环浏览文件后,你需要检查你的条件。

if(item.match(re)){output.push([item, link])};

通过下面的脚本,你可以选择从哪个文件夹中列出文件 同样也可以选择在哪个工作表中写入数据。

代码。

// Create a menu to run the script
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('List Files')
    .addItem('Go!', 'listMyFiles')
    .addToUi();
}

function listMyFiles() {

  var folder = DriveApp.getFolderById('FOLDER ID GOES HERE');
  var sheetId = "SHEET ID GOES HERE";

  //Set up spreadsheet
  var ss = SpreadsheetApp.openById(sheetId);

  // specify the name of the sheet to write the DATA  

  var sheet = ss.getSheetByName("Sheet1");
  var re =new RegExp("[a-zA-Z]{2}[0-9]{3}[a-zA-Z]");

  sheet.getRange("A2:B").clear();

  var output = [];
  var file;
  var item;
  var link;
  var contents = folder.getFiles();
  while(contents.hasNext()) {
    file = contents.next();    
    data = [
      item =  file.getName(),
      link =  file.getUrl(),
    ];
    if(item.match(re)){
    output.push([item, link]);
    }
    // write data to the sheet
    sheet.getRange(2, 1, output.length, output[0].length).setValues(output);
  }  
};

你的工作表会类似于这样:

enter image description here

脚本已经 "忽略 "了其他文件 只带来符合条件的文件。


1
投票

谢谢大家,在你们的指导下,我似乎已经尽我有限的能力解决了这个问题......。

通过在第18行添加执行函数(re.exec(filename);),脚本成功地从文件名中提取了regex定义的项目#,并将其写入指定的范围(A2 + down)。

function listitems(){
 var ss=SpreadsheetApp.getActiveSheet();
 var re=new RegExp("[a-zA-Z]{2}[0-9]{3}[a-zA-Z]");
 var output=[];

//CLEAR RANGE
 var listrange=ss.getRange("A2:O")
 listrange.clearContent();

//SET FILE LIST
 var folder=DriveApp.getFolderById(‘Folder ID');
 var contents=folder.getFiles();
 var file;
 var item;
 while(contents.hasNext()){
    file=contents.next();
    filename=file.getName();
    item=re.exec(filename);
    output.push([item]);

    ss.getRange(2,1,output.length,output[0].length).setValues(output);
 }
}

我接下来的困扰是想办法在脚本端将项#单元格链接到对应的文件,而不是将项#和文件URL都写到工作表中,然后应用=hyperlink()公式,所以我将在本帖之外探讨这些技巧。

欢呼吧

© www.soinside.com 2019 - 2024. All rights reserved.