用于将 google drive 中的文件名列表与 google sheet 列中的名称列表进行比较的 Apps 脚本,以将新文件从驱动器添加到工作表

Posted

技术标签:

【中文标题】用于将 google drive 中的文件名列表与 google sheet 列中的名称列表进行比较的 Apps 脚本,以将新文件从驱动器添加到工作表【英文标题】:Apps Script to Compare a list of file names in google drive to a list of names in a google sheet column to add new files from drive to sheet 【发布时间】:2022-01-23 23:19:16 【问题描述】:

我有一个应用程序脚本,它将谷歌驱动器文件夹的文件名和 URL 写入指定的工作表。在其当前形式中,它将驱动器文件夹的全部内容附加到工作表中。我需要它做的是首先将工作表上已经存在的文件名与驱动器中的文件名进行比较,然后只附加工作表上不存在的文件。

这是我试图用来比较两个列表并仅添加不存在的名称的代码。

function listFolderContents() 

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('files');
  const folder = DriveApp.getFolderById('1ShsR9jQAkTCeezouk6sW0NnPpo-kHFjK');
  const contents = folder.getFiles();
  const existsOnSheet = sheet.getRange(1,1,sheet.getLastRow(),1).getValues();
  //console.log(existsOnSheet);
  
  //I want to only append rows with names that do not already exist
  
  var file;
  var name;
  var link;
  var row;
  while(contents.hasNext()) 
    file = contents.next();
    name = file.getName();
    link = file.getUrl();
    if (name === existsOnSheet)
      return
      
    else
    sheet.appendRow( [name, link] );
         
    

【问题讨论】:

我会在工作表中列出文件的平面列表,然后使用!~list.indexOf(drive file name) 所以您必须提供栏目信息,以便我们为您提供更完整的答案 【参考方案1】:

也许你应该替换这个:

if (name === existsOnSheet)

用这个:

if (existsOnSheet.includes(name))

并在此处添加flat()

const existsOnSheet = sheet.getRange(1,1,sheet.getLastRow(),1).getValues().flat();

以防万一:

var old_list = ['a', 'b', 'c']
var new_list = ['a', 'b', 'c', 'd', 'e']
var new_files = new_list.filter(x => !old_list.includes(x))

console.log(new_files) // output: ['d', 'e']

别忘了,Google 云端硬盘上的文件夹可以包含同名文件。也许使用 ID 或 URL 来识别文件夹中的文件是有意义的。

【讨论】:

yuri,非常感谢你,正是我需要的。并感谢有关驱动器文件的提醒,我们将确保避免驱动器文件夹上的重复。我完成的脚本现在看起来像这样,如果它可以帮助其他人的话。【参考方案2】:

最终的工作脚本:

// replace your folder below with the folderID for which you want a listing
function listFolderContents() 

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('index');
  const folder = DriveApp.getFolderById('1ShsR9jQAkTCeezouk6sW0NnPpo-kHFjK');
  const contents = folder.getFiles();
  const existsOnSheet = sheet.getRange(2,1,sheet.getLastRow(),1).getValues().flat();
  //console.log(existsOnSheet);
  
  //I want to only append rows with names that do not already exist
  
  var file;
  var name;
  var link;
  //var row;
  while(contents.hasNext()) 
    file = contents.next();
    name = file.getName();
    link = file.getUrl();
    if (existsOnSheet.includes(name))
return
     
    else 
    sheet.appendRow( [name, link] );

        
   
```

【讨论】:

以上是关于用于将 google drive 中的文件名列表与 google sheet 列中的名称列表进行比较的 Apps 脚本,以将新文件从驱动器添加到工作表的主要内容,如果未能解决你的问题,请参考以下文章

iOS 中的 Google Drive SDK

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

React-native Google Drive如何获取文件和文件夹列表?

参数列表文件API调用Google Drive API中的created_at属性

用于复制整个 Google Drive 文件结构的 Google Apps 脚本;如何避免超时?

从 .NET WCF 服务将文件插入 Google Drive