0

Googleシートのエントリをループして各行のフォルダを作成し、フォルダのIDをリストするスクリプトがあります。私は、フォルダIDのリストをループし、テンプレートマスターフォルダの内容(およびサブコンテンツ)を新しいフォルダにコピーする必要があります。 (example hereGoogleドライブのフォルダとそのコンテンツをフォルダIDのリストにコピーする方法

Iveは、ターゲットとソースフォルダをハードコーディングすることによって1つのインスタンスでこれを行うことができるいくつかの例を見つけましたが、より可変かつ動的にするためにいくつかの助けが必要です。

これは、これまで私が持っているコードです:

function folderMaker(){ 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheets()[0];//get first sheet 



    var last = sheet.getLastRow();//end of list size 


    //prompt for Folder Name 

    var ui = SpreadsheetApp.getUi(); 
    var ask = ui.prompt('What is the Main Agent Folder Name? \nAgent folders will go inside this folder.'); 
    var response = ask.getResponseText(); 

    //Create a business folder 

    var tFolder = DriveApp.createFolder(response); 
    var tFolderId = tFolder.getId();//ID to business folder 
    var tFolderUrl = tFolder.getUrl();//URL to business folder 
    sheet.getRange('A1').setValue('business Folder');//put business folder info in row 1 
    sheet.getRange('B1').setValue(response); 
    sheet.getRange('C1').setValue(tFolderUrl); 
    sheet.getRange('D1').setValue(tFolderId); 
    sheet.getRange('E1').setValue(' '); 

    //agent folder names 

    var ask2 = ui.prompt('agent folder name'); 
    var response2 = ask2.getResponseText(); 

    //call the document to be copied 


    Logger.log('last '+last); 
    for(var i=3;i<last+1;i++){ 

    var agent = sheet.getRange(i, 1).getValue();//get agent name 
    var email = sheet.getRange(i,2).getValue();//get agent email 
    var folder = DriveApp.createFolder(agent + ' '+response2); 
    var sFolder = folder.getName(); 
    var sFolderId = folder.getId(); 
    var sFolderUrl = folder.getUrl(); 
    folder.addEditor(email);//add agent as an editor of the folder 
    sheet.getRange(i,3).setValue(sFolder); 
    sheet.getRange(i,4).setValue(sFolderId); 
    sheet.getRange(i,5).setValue(sFolderUrl); 

    //Add agent folders to business folder 
    var businessFolder = DriveApp.getFolderById(tFolderId); 

    var agentFolder = DriveApp.getFolderById(sFolderId); 

    businessFolder.addFolder(agentFolder);//put agent folder in business folder 

    DriveApp.getRootFolder().removeFolder(agentFolder);//take agent folder out of Google Drive 
    } 

} 

答えて

0

あなたが、あなたのシートを繰り返し処理の行ごとにフォルダを作成し、その新規フォルダにテンプレートフォルダの内容をコピーしようとしている表示されます。私はあなたのためのトリックを行う必要があるものを書いたし、あなたが探しているものとそれが動作するかどうかを確認するためにそれを読むことを強くお勧めします。

function main() { 
    /* 
    Get a template folder id from sheet, and copy that template to custom folders and share with a user. 
    */ 
    var ss, sheet, templateFolderId, templateFolder, rootFolder, 
     header, range, values, i, 
     folderPath, folder 
    ; 
// Get spreadsheet and sheet 
    ss = SpreadsheetApp.getActiveSpreadsheet(); 
    sheet = ss.getActiveSheet(); 

// Get template folder 
    templateFolderId = sheet.getRange("C2").getValue(); 
    templateFolder = DriveApp.getFolderById(templateFolderId); 

// Get root folder for where the new folders will live/be created 
/* 
*** Change this location if you nest them somewhere else*** 
*/ 
    rootFolder = DriveApp.getRootFolder(); 

// Get rows to process 
    header = sheet.getRange(3,1,1, sheet.getLastColumn()).getValues()[0]; // Get header row 
    header = Map(header); // Map header to an object to give column references clarity later 
    range = sheet.getRange(4, 1, sheet.getLastRow() -3, sheet.getLastColumn()); // Get range of rows for processing 
    values = range.getValues(); // Get data 

// Iterate through rows. 
    i = values.length; 
    while (i--) { 
// Check for missing folder IDs (indicates it hasn't been processed). 
    if (! values[i][header["Folder ID"]]) { 
//  Split folder name into pieces 
     folderPath = values[i][header["Folder Name"]].split("/"); 
//  Get destination folder 
     folder = EnsureFolderExists(folderPath, rootFolder); 
//  Copy template to folder 
     CopyMasterTemplate(templateFolder, folder); 
//  Share folder with user 
     folder.addEditor(values[i][header["Email To Share Folder"]]); 
//  Save folderId to row 
     values[i][header["Folder ID"]] = folder.getId(); 
     values[i][header["Folder URL"]] = folder.getUrl(); 
    } 
    } 

// Save updated values to range 
    range.setValues(values); 
} 

function CopyMasterTemplate (templateFolder, destinationFolder) { 
    /* 
    Copy contents of templateFolder to folder 
    Must be recursive - folders within folders, unknown depth 
    */ 
    var fileIterator, folderIterator, folder 
    ; 
// Copy files 
    fileIterator = templateFolder.getFiles(); 
    while (fileIterator.hasNext()) { 
    fileIterator.next().makeCopy(destinationFolder); 
    } 
// Copy folders 
    folderIterator = templateFolder.getFolders(); 
    while (folderIterator.hasNext()) { 
    folder = folderIterator.next(); 
    CopyMasterTemplate(folder, destinationFolder.createFolder(folder.getName())); 
    } 
    return; 
} 

function EnsureFolderExists (a, within) { 
    /* 
    Ensure folder path split in array a is available in folder within 
    */ 
    var folder = within, 
     folderIterator, 
     i = 0 
    ; 
    while (i +1 <= a.length) { 
    folderIterator = folder.getFoldersByName(a[i]); 
    if (folderIterator.hasNext()) { 
     folder = folderIterator.next(); 
    } 
    else { 
     folder = folder.createFolder(a[i]); 
    } 
    i++; 
    } 
    return folder; 
} 
function Map (a) { 
    /* 
    Map 1d array to object 
    */ 
    var o = {}, 
     i = a.length 
    ; 
    while (i--) { 
    o[a[i]] = i; 
    } 
    return o; 
} 
+0

あなたは絶対的な伝説です。私はいつも繰り返しながら少し苦労しましたが、これは本当にうまくいきます。 – Tiana

+0

コードはこれまでのところ1つのわずかなヒッチでうまくいきました。親(templatefolder)内の子フォルダはコピーされているようですが、3人の子供がいます。あなたは直接的に私を助けたり指したりすることができますか?これまでのところあなたの助けを感謝します。 – Tiana

+0

私はCopyMasterTemplateで変数を宣言することを無視していることが原因だと思います。上記のコードを編集しました。これで、レベルごとに複数のフォルダをコピーするようになりました。 –

関連する問題