2017-07-27 3 views
1

Ich bin absolut in Code-Probleme schwimmen und kann nicht scheinen, dass dies funktioniert. Ich hoffe, dass diese Gruppe kluger Google Apps Script-Genies helfen kann.Link zu Google Drive von Inhalt von Google Tabellen

Erstens: Meine Google Drive verwendet die folgende Ordnerstruktur (mit ersten Unterordner für jeden Buchstaben des Alphabets und dann die zweiten Unterordner für jede Angelegenheit, zB

/Clients 
/A 
    /Albert, Bob (1-15-0003) Re Matter 
/B 
    /Bork, Mat (1-54-0003) Re Other Matter 

Ich habe ein Google-Tabelle Dokument mit verschiedenen Blättern, die Jeder verweist auf eine andere Materialliste in der entsprechenden Zelle G 2. Ich möchte ein Skript, das mein Google Drive automatisch nach diesen zweiten Unterordnern durchsucht und einen Hyperlink zum Ordner erstellt.

Mein Code ist wie folgt, aber leider nicht Es funktioniert nicht. Es scheint, dass es die Unterordner nicht finden kann.

function SearchFolder() { 
// Searches Google Drive for the folder for the Active Sheet 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getActiveSheet(); 
    var searchTerm = ss.getRange('G2').getValue(); 
    var Folders = DriveApp.searchFolders("title contains '"+searchTerm.replace("'","\'")+"' and trashed = false and hidden = false"); 
    var Folder = Folders.next(); 
sheet.getRange('G2').setFormula("=HYPERLINK(\""+Folder.getUrl()+"\",\""+searchTerm+"\")"); 
} 

Erwartetes Ergebnis wäre, wenn G2 meines aktuellen Blatt liest 1-15-0003 für das G2 mit einem Hyperlink mit der Google Drive URL, die auf die Ordner-ID für/A/Albert, Bob ersetzt werden (1-15-0003) Re Angelegenheit.

Danke für jede Hilfe.

+0

Das Skript für mich funktioniert. Haben Sie dem Skript Laufwerksberechtigung erteilt? – Ritz

+0

Ich habe. es scheint auch heute Morgen besser für mich zu funktionieren. Vielleicht brauchte Google Drive eine Säuberung oder so etwas. – Databoy2k

Antwort

1

Eine interaktive Verzeichnisbaum

Diese Funktionen arbeiten zusammen mit dem JStree JQuery-Plugin ein Verzeichnis der interaktiven Baum zu erzeugen. Es gibt ein paar Ids, die Sie hinzufügen müssen, nämlich die ID des DataStorage-Ordners und die ID des Stammverzeichnisses in Ihrer Struktur. Es gibt auch eine doGet-Funktion, die bereits hier ausgeführt wird, falls Sie eine Webapp benötigen. Es gibt mehrere Dateien, die ich für HTML verwende, sowie einige HTML-Codes, die in den Polygonzug-Code integriert sind. Es war ein ziemlich kompliziertes Projekt für mich. Es gibt wahrscheinlich bessere Möglichkeiten, dies zu tun.

Datei In Datastorage Folder: TopToBodyWeb

<html> 
    <head> 
     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css" /> 
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
     <script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script> 
     <style>.file{color:#d81840;}.contrls{padding:10px 10px 10px 10px;}.timestmp {width: 200px;margin-left:5px;padding:10px 0px 5px 50px;background-color:rgba(121, 25, 0, 0.36);color:white;}i.jstree-icon.jstree-themeicon{display:none;}</style> 
     <script type="text/javascript">           
     $(function() { $('#selector').jstree({"core" : {"themes":{"variant":"large"}},"plugins" : [ "wholerow"]}); 

     });          
     </script> 
     </head> 
     <body><div id="selector"><ul> 

Datei In Datastorage Folder: TopToBody

<html> 
    <head> 
     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css" /> 
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
     <script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script> 
     <style>.file{color:#d81840;}.contrls{padding:10px 10px 10px 10px;}.timestmp {width: 200px;margin-left:5px;padding:10px 0px 5px 50px;background-color:rgba(121, 25, 0, 0.36);color:white;}i.jstree-icon.jstree-themeicon{display:none;}</style> 
     <script type="text/javascript">           
     $(function() { $('#selector').jstree({"core" : {"themes":{"variant":"large"}},"plugins" : [ "wholerow"]}); 

     });          
     </script> 
     </head> 
     <body><div class="cntrls"><input type="button" value="Exit" onClick="google.script.host.close();" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    <input type="button" value="Delete Cache & Exit" onClick="google.script.run.clearDirlist();google.script.host.close();" /></div><div id="selector"><ul> 

Datei In Datastorage Folder: BodyToEndWeb

</ul></div></body></html> 

Datei In Datastorage Folder: BodyToEnd

</ul></div><div class="cntrls"><input type="button" value="Exit" onClick="google.script.host.close();" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<input type="button" value="Delete Cache & Exit" onClick="google.script.run.clearDirlist();google.script.host.close();" /></div><br /></body></html> 

Datastorage-Ordner: Enthält auch Datei: CurrentDirectoryListing

Dies ist Code.gs:

var GStorage = ''; 
var folderID = "TheIDofDataStorageFolderGoesHere"; 
var guli = 0; 
var glii = 0; 
var glevel = 0; 

function onOpen() 
{ 
    var ui = SpreadsheetApp.getUi(); 
    ui.createMenu('My Tools') 
      .addItem('Dir MyDrive','runtraverseFolder') 
      .addToUi(); 
} 

function runFile() 
{ 
    var file = loadFile(); 
    if(file) 
    { 
    dispStatus('Stored MyDrive Directory List', file, 1000, 600); 
    } 
    else 
    { 
    SpreadsheetApp.getUi().alter('File not found in function runfile'); 
    } 
} 

function loadFile(filename) 
{ 
    var filename = (typeof(filename) !== 'undefined')? filename : 'UploadFile'; 
    var fldr = DriveApp.getFolderById(folderID); 
    var file = fldr.getFilesByName(filename); 
    var s = ''; 
    while(file.hasNext()) 
    { 
    var fi = file.next(); 
    var target = fi.getName(); 
    if(target == filename) 
    { 
     s = fi.getBlob().getDataAsString(); 
    } 
    } 
    return s; 
} 

function delFile(filename) 
{ 
    var filename = (typeof(filename) !== 'undefined')? filename : 'UploadFile'; 
    var fldr = DriveApp.getFolderById(folderID) 
    var file = fldr.getFilesByName(filename); 
    var targetFound = false; 
    while(file.hasNext()) 
    { 
    var fi = file.next(); 
    var target = fi.getName(); 
    if(target == filename) 
    { 
     targetFound = true; 
     fldr.removeFile(fi); 
     SpreadsheetApp.getUi().alert('File: ' + filename + ' was removed from: ' + fldr.getName() + '/' + target); 
    } 
    } 
    return targetFound; 
} 

function doGet() 
{ 
    var output=HtmlService.createHtmlOutput(getStoredDirectory()); 
    return output.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL); 
} 

Dies ist traverse.gs:

function runtraverseFolder() 
{ 
    var dirlist = loadDirlist(); 
    var controls = '<div class="cntrls"><input type="button" value="Exit" onClick="google.script.host.close()" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ 
    <input type="button" value="Delete Cached Listing & Start Over" onClick="google.script.run.clearDirlist();" /></div><br />'; 
    var toptobody = loadFile('TopToBody'); 
    var bodytoend = loadFile('BodyToEnd'); 
    if(dirlist) 
    { 
    dispStatus('Stored MyDrive Directory List', toptobody + GStorage + bodytoend, 600, 500); 
    } 
    else 
    { 
    GStorage =''; 
    GFlag = 0; 
    traverseFolder(DriveApp.getFolderById('ThisistheIDoftheRootTraverseFolder')); 
    saveDirlist(); 
    dispStatus('Current MyDrive Directory Listing', toptobody + GStorage + bodytoend, 600, 500); 
    } 
} 

function getStoredDirectory() 
{ 
    loadDirlist(); 
    var toptobody = loadFile('TopToBodyWeb'); 
    var bodytoend = loadFile('BodyToEndWeb'); 
    return toptobody + GStorage + bodytoend; 
} 

function traverseFolder(folderObj) 
{ 
    glevel++; 
    if(glevel < 2) 
    { 
    GStorage += '<li class="fldr" id="fd' + glii++ + '"' + 'data-jstree=\'{ "selected" : true, "opened" : true }\'' + '><a href="https://drive.google.com/open?id='+ folderObj.getId() +'" target="_blank" >Folder: ' + folderObj.getName() + '</a></span>'; 
    //GStorage += '<li class="fldr" id="fd' + glii++ + '"' + 'data-jstree=\'{ "selected" : true, "opened" : true }\'' + '><a href="#" target="_blank" title="Dummy Link can not get file listing" >Folder: ' + folderObj.getName() + '</a></span>'; 
    } 
    else 
    { 
    GStorage += '<li class="fldr" id="fd' + glii++ + '"><a href="https://drive.google.com/open?id=' + folderObj.getId() +'" target="_blank" >Folder: ' + folderObj.getName() + '</a></span>'; 
    //GStorage += '<li class="fldr" id="fd' + glii++ + '"><a href="#" target="_blank" title="Dummy Link can not get file listing." >Folder: ' + folderObj.getName() + '</a></span>'; 
    } 
    GStorage += '<ul id="ul'+ guli++ +'">'; 
    var subs = folderObj.getFolders(); 
    var files = folderObj.getFiles(); 
    if(files) 
    { 
    //GStorage += '<ul id="ul'+ guli++ +'">'; 
    while(files.hasNext()) 
    { 
     var fi = files.next();; 
     GStorage += '<li class="file" id="fi' + glii++ + '"><a href="https://drive.google.com/open?id='+ fi.getId() +'" target="_blank" title="Right Click to Open File in new tab." >File: ' + fi.getName() + '</a></span>'; 
    } 
    //GStorage += '</ul>'; 
    } 
    while (subs.hasNext()) 
    { 
    traverseFolder(subs.next()); 
    } 
    GStorage += '</ul></li>'; 
    glevel--; 
} 

function saveDirlist() 
{ 
    var filename = 'CurrentDirectoryListing'; 
    var fldr = DriveApp.getFolderById(folderID); 
    var fldrname = fldr.getName(); 
    var file = fldr.getFilesByName(filename); 
    var targetFound = false; 
    var timeStamp = '<div class="timestmp">' + Utilities.formatDate(new Date(), "GMT-7", "yyyy-MM-dd HH:mm:ss") + '</div>'; 
    while(file.hasNext()) 
    { 
    var fi = file.next(); 
    var target = fi.getName(); 
    if(target == filename) 
    { 
     targetFound = true; 
     fi.setContent(timeStamp + GStorage); 
     SpreadsheetApp.getUi().alert('Directory Listing was updated using: ' + target); } 
    } 
    if(!targetFound) 
    { 
    var created = fldr.createFile('CurrentDirectoryListing',timeStamp + GStorage); 
    if(created) 
    { 
     //SpreadsheetApp.getUi().alert('Directory Listing was stored here: ' + fldr.getName() + '/' + created.getName()); 
    } 
    else 
    { 
     SpreadsheetApp.getUi().alert('Unknown Error: Directory List was not stored'); 
    } 
    } 
} 

function loadDirlist() 
{ 
    var filename = 'CurrentDirectoryListing'; 
    var fldr = DriveApp.getFolderById(folderID); 
    var file = fldr.getFilesByName(filename); 
    var targetFound = false; 
    while(file.hasNext()) 
    { 
    var fi = file.next(); 
    var target = fi.getName(); 
    if(target == filename) 
    { 
     targetFound = true; 
     GStorage = fi.getBlob().getDataAsString(); 
     //SpreadsheetApp.getUi().alert('Directory Listing was retreived from: ' + fldr.getName() + '/' + target); 
    } 
    } 
    return targetFound; 
} 

function clearDirlist() 
{ 
    var filename = 'CurrentDirectoryListing'; 
    var fldr = DriveApp.getFolderById(folderID) 
    var file = fldr.getFilesByName(filename); 
    var targetFound = false; 
    while(file.hasNext()) 
    { 
    var fi = file.next(); 
    var target = fi.getName(); 
    if(target == filename) 
    { 
     targetFound = true; 
     fldr.removeFile(fi); 
     //SpreadsheetApp.getUi().alert('File: ' + filename + ' was removed from: ' + fldr.getName() + '/' + target); 
    } 
    } 
    return targetFound; 
} 

This is utility.gs: 

function dispStatus(title,html,width,height) 
{ 
// Display a modeless dialog box with custom HtmlService content. 
    var title = typeof(title) !== 'undefined' ? title : 'No Title Provided'; 
    var width = typeof(width) !== 'undefined' ? width : 250; 
    var height = typeof(height) !== 'undefined' ? height : 300; 
    var html = typeof(html) !== 'undefined' ? html : '<p>No html provided.</p>'; 
    var htmlOutput = HtmlService 
    .createHtmlOutput(html) 
    .setWidth(width) 
    .setHeight(height); 
SpreadsheetApp.getUi().showModelessDialog(htmlOutput, title); 
} 
+0

Sie schreiben eine Menge Arbeit in diesen Kommentar und ich danke Ihnen dafür. Es war viel mehr Code als ich suchte, aber es war sehr informativ. Es ist eine Schande, dass GAS so viel verlangt ... je ne sais quois ... um etwas zu tun, das so einfach zu sein scheint. – Databoy2k

+0

Denken Sie daran, obwohl dies eine interaktive Lösung ist.Hier ist eine [kleine Demo] (http://www.wiechman4lakewood.com/resources/city-council-archives) davon. Sie benötigen Google Apps-Skript auf dem Dienst und eine Javascript/HTML-Seite im Browser, so dass es das Minimum für eine Web-App irgendeiner Art ist. – Cooper

Verwandte Themen