Page tree

Tartu Ülikooli IT viki

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 9 Next »

Siin lehel on skripti kood ning juhend, kuidas seda kasutada, et kopeerida isiklikust draivist kaustapuu UT Google Workspace shared drive'i.

Eeldused

  • Kõike järgnevat tuleb teha Google kasutajaga, kellel on vähemalt lugemisõigus kopeeritavale sisule
  • Sellele kasutajale peab olema antud vähemalt Contributor taseme õigused Ülikooli Shared drive kettal
    • Selleks pöördu kasutajatoe/moderaatori poole (vaja üle täpsustada)

Piirangud

  • Varu aega - skript töötab aeglaselt
  • Skript ei tee mingeid duplikaatide ega turvakontrolle ning tehtud ei ole põhjalikke testimisi
    • Kopeerimine ei ole oma olemuselt destruktiivne (originaalid säilivad)
    • Kui samanimeline kaust on juba sihtkohas olemas, luuakse uus kaust
  • Kopeerimise käigus:
    • Kopeeritavale sisule tekib ligipääs kõigile, kellel on ligipääs sihtkaustale/draivile
    • Kõik eelnevad ligipääsud ning õigused kaovad
    • Muutuvad kaustade ning failide lingid
    • Kaovad failide versioonid ning ajalugu
  • Rakenduvad Google drive ning Google API piirangud

Mida teha

  • Mine lehele https://script.google.com
  • Vajuta vasakul üleval nurgas nuppu New project
  • Soovi korral muuda ära projekti nimi
  • Kustuta automatselt genereeritud skripti päis ning kopeeri allolev skript selle asemele
  • Muuda skripti kolme esimest rida:
    • email@domain.xxx → meiliaadress, kuhu saadetakse skripti logid
    • sourcefolderID → kopeeritava kausta ID
    • targetfolderID → sihtkausta või shared draivi ID
      • ID saab aadressiribalt kui avada vastav kaust/draiv (nt: 1KMerSre4WcCl-5AfZIYkeMaG79GPSGIa)
  • Salvesta projekt
  • Vajuta ülemisest menüüst nuppu Run
  • ...
  • Profit

Kood

Code
function start() {

  //global variables to facilitate logging and email

  //Edit these 3 lines:
  var recipient1 = 'email@domain.xxx';
  PropertiesService.getScriptProperties().setProperty('sourceFolderIdGlobal', 'sourcefolderID');
  PropertiesService.getScriptProperties().setProperty('targetParentFolderIdGlobal', 'targetfolderID');
  
  var recipient2 = recipient1;
  PropertiesService.getScriptProperties().setProperty('StartTime', new Date());   //get timestamp to record the intial execution time

  {
    // Google App Script to the rescue
    // Code adapted from this artcile https://www.labnol.org/code/19979-copy-folders-drive
    // Thank you Amit Agarwal https://github.com/labnol
    // This script will copy all files and folders from the source Folder ID to a Destination Folder ID
    // The Source Folder name will be created in the destination folder
    // If you have been driven insane by Google Drives inability to copy a folder structure from MyDrive to a Shared drive BOOM!
    // 
    // Important note: Enable the Drive service in the script editor https://developers.google.com/apps-script/advanced/drive
     
    var sourceFolderId = PropertiesService.getScriptProperties().getProperty('sourceFolderIdGlobal'); //Folder ID of the folder structure you want to copy
    //Add target folder ID if you want the dest to be somewhere other than the root of Mydrive
    var targetParentFolderId = PropertiesService.getScriptProperties().getProperty('targetParentFolderIdGlobal');  
    
    var sourceFolder = DriveApp.getFolderById(sourceFolderId); //Source Folder
    
    if (targetParentFolderId.length > 0 ) {
      // If the target folder ID has been provided, create the target folder within that folder
      var targetParent = DriveApp.getFolderById(targetParentFolderId); //Parent Folder (target)
      Logger.log( "Create target folder: " + sourceFolder.getName() + " in " + targetParent.getName()); //copy console entry into stored logger
      var target = targetParent.createFolder(sourceFolder.getName()); //Create the source folder we are copying
    } else {
      // If the target folder ID is empty, create the target folder within the root of Mydrive
      Logger.log( "Create target folder in Mydrive: " + sourceFolder.getName()); //copy console entry into stored logger
      Logger.log( "Create target folder in Mydrive: " + sourceFolder.getName()); //copy console entry into stored logger
      var target = DriveApp.createFolder(sourceFolder.getName()); //Create the source folder
    }
    
    //Here we go
    Logger.clear; //Clear stored log data before next execution so we don't keep sending old data
    var recipient = recipient1;  //Destination email address to notify that script has started (for triggered executions)
    var subject = 'MyDrive Copy Log';
    var body = 'MyDrive Copy Started for folder pair: '+sourceFolderId+' to '+targetParentFolderId+"\n This script execution was started at "+ PropertiesService.getScriptProperties().getProperty('StartTime');
    MailApp.sendEmail(recipient, subject, body);

    copyFolder(sourceFolder, target);
    Logger.log("Copy finish"); //copy console entry into stored logger
    
    var recipient = recipient2; //Destination email address to send final completion notice and the logged console data
    var subject = 'MyDrive Copy Log';
    var body = 'MyDrive Copy finished at '+ new Date()+';'+" The execution log is as follows: \n" +Logger.getLog();
    MailApp.sendEmail(recipient, subject, body);
  }
}

function copyFolder(source, target) {
  var folders = source.getFolders();
  var files   = source.getFiles();

  while(files.hasNext()) {
    var file = files.next();
    Logger.log( "Copying file: " + file.getName()); //copy console entry into stored logger
    file.makeCopy(file.getName(), target);
  }

  while(folders.hasNext()) {
    var subFolder = folders.next();
    var folderName = subFolder.getName();
    Logger.log( "Copying folder: " + folderName); //copy console entry into stored logger
    var targetFolder = target.createFolder(folderName);
    copyFolder(subFolder, targetFolder);
  }
}
  • No labels

This page has no comments.