gpt4 book ai didi

google-apps-script - 如何在我的谷歌驱动器的特定文件夹中查找重复文件(按名称和/或大小)?

转载 作者:行者123 更新时间:2023-12-04 18:07:48 35 4
gpt4 key购买 nike

是否可以创建一个谷歌应用程序脚本,该脚本将自动选择特定(当前)文件夹中的重复文件(然后我只需单击一下即可删除它们)?

https://developers.google.com/apps-script/reference/drive/

我问这个是因为 Google drive pc 客户端在更新它们时会创建随机重复文件!他们想解决这个错误,但我必须在每个文件夹中手动选择它们,然后删除它们。这是非常烦人和耗时的。
https://productforums.google.com/forum/#!category-topic/drive/report-a-problem/_ApOopI-Xkw

编辑:或者,由于 Windows 无法在同一个文件夹中创建相同的文件名,因此在特定主文件夹(及其每个相关子文件夹)中找到所有重复的文件名并将其放入垃圾箱。

最佳答案

为了更好的可读性,我在第二个答案中添加了这个答案的下一部分。

这是处理重复项的代码:它适用于 2个步骤:

  • 检测重复并在工作表中标记它们以检查一切是否正常( markDuplicates() )
  • 删除要保留的文件上的红色背景(完成第 3 步后它们将变为黄色)
  • 删除选定(标记)的文件,实际上将它们移动到垃圾箱,您必须从驱动器 Ui 手动清空垃圾箱。 ( tramDuplicates() ) 删除的文件将被涂成深红色以确认删除。


  • 最后编辑:

    将完整代码放在这里,并将一些函数设为私有(private),以避免由于错误的脚本调用而导致错误。
    function startProcess(){
    PropertiesService.getScriptProperties().deleteAllProperties();
    try{
    ScriptApp.deleteTrigger(ScriptApp.getProjectTriggers()[0]);
    }catch(e){}
    var sh = SpreadsheetApp.getActiveSheet();
    sh.getDataRange().clear();
    sh.getRange(1,1,1,4).setValues([['fileName (logged @'+Utilities.formatDate(new Date(),Session.getScriptTimeZone(),'MMM-dd-yyyy HH:mm')+')','fileSize','parent folders tree','fileID']]);
    var trig = ScriptApp.newTrigger('getDriveFilesList_').timeBased().everyMinutes(5).create();
    Logger.log(trig.getUniqueId()+' '+trig.getHandlerFunction());
    getDriveFilesList_();
    }

    function getDriveFilesList_(){
    var content = [];
    var startTime = new Date().getTime();
    var sh = SpreadsheetApp.getActiveSheet();
    if( ! PropertiesService.getScriptProperties().getProperty('numberOfFiles')){
    PropertiesService.getScriptProperties().setProperty('numberOfFiles',0);
    }

    var numberOfFiles = Number(PropertiesService.getScriptProperties().getProperty('numberOfFiles'));
    Logger.log(numberOfFiles);
    var max = numberOfFiles+10000;
    if( ! PropertiesService.getScriptProperties().getProperty('continuationToken')){
    var files = DriveApp.getFiles();
    // var files = DriveApp.getFolderById('0B3qSFd_____MTFZMDQ').getFiles();// use this line and comment the above if you want to process a single folder
    // use your chozen folder ID of course (available from the browser url , the part after "https://drive.google.com/?authuser=0#folders/")
    }else{
    var files = DriveApp.continueFileIterator(PropertiesService.getScriptProperties().getProperty('continuationToken'))
    }
    while(files.hasNext() && numberOfFiles<(max)){
    var file = files.next()
    if(file.getSize()>0){
    numberOfFiles++;
    var folder = '(shared)';
    if(file.getParents().hasNext()){folder = getTree_(file)}
    content.push([file.getName(),file.getSize(),folder,file.getId()])
    }
    if(new Date().getTime()-startTime > 250000){break};
    }
    sh.getRange(sh.getLastRow()+1,1,content.length,content[0].length).setValues(content);
    if(!files.hasNext()){ScriptApp.deleteTrigger(ScriptApp.getProjectTriggers()[0]);Logger.log('done !'); sh.getRange(sh.getLastRow()+1,1).setValue('All files processed ('+numberOfFiles+' found)')};
    var continuationToken = files.getContinuationToken()
    PropertiesService.getScriptProperties().setProperty('numberOfFiles',numberOfFiles);
    PropertiesService.getScriptProperties().setProperty('continuationToken',continuationToken);
    }

    function markDuplicates(){
    handleDuplicates_(false)
    }

    function trashDuplicates(){
    handleDuplicates_(true)
    }

    function handleDuplicates_(trash){
    var sh = SpreadsheetApp.getActiveSheet();
    sh.setFrozenRows(1);
    sh.sort(1);
    var data = sh.getDataRange().getValues()
    var headers = data.shift()
    var lastComment = data.pop();
    var toDelete = [];
    var item = data[0];
    for(var n=1 ; n<data.length; n++){
    if(data[n][0]==item[0] && data[n][1]==item[1]){
    toDelete.push('delete '+n);
    }
    item=data[n];
    }
    var marker = sh.getRange(2,1,data.length,1).getBackgrounds();
    for(var n in data){
    if(!trash){marker.push(['#FFF'])};
    if(toDelete.indexOf('delete '+n)>-1 && !trash){
    marker[n][0] = '#F99';
    }
    if(toDelete.indexOf('delete '+n)>-1 && trash){
    if(marker[n][0]=='#ff9999'){
    try{
    DriveApp.getFileById(data[n][3]).setTrashed(trash);
    marker[n][0] = '#F33';
    }catch(err){Logger.log(err)}
    }else{
    marker[n][0] = '#FF9';
    }
    }
    }
    sh.getRange(2,1,marker.length,1).setBackgrounds(marker);
    }

    function getTree_(file){
    var tree = [];
    var folderP = file.getParents()
    while (folderP.hasNext()){
    var folder = folderP.next();
    folderP = folder.getParents();
    tree.push(folder.getName());
    }
    return tree.reverse().join('/');
    }

    关于google-apps-script - 如何在我的谷歌驱动器的特定文件夹中查找重复文件(按名称和/或大小)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22736141/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com