首页 > 解决方案 > 如何使用谷歌选择器 api 计算文件夹谷歌脚本的大小

问题描述

哟,我想创建一个脚本,用户可以在其中选择一个文件夹,然后通过获取文件夹的 id 来显示文件夹的大小。我设法检索了 ID,但我不知道如何从这个 id 计算大小并显示它。这是显示选择器谷歌驱动器的代码:

<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons.css">
  <script type="text/javascript">
    var DIALOG_DIMENSIONS = {
        width: 600,
        height: 425
    };
    var pickerApiLoaded = false;

    function onApiLoad() {
        gapi.load('picker', {
            'callback': function() {
                pickerApiLoaded = true;
            }
        });
        google.script.run.withSuccessHandler(createPicker)
            .withFailureHandler(showError).getOAuthToken();
    }

    function createPicker(token) {

        if (pickerApiLoaded && token) {

            var docsView = new google.picker.DocsView()
                .setIncludeFolders(true)
                .setMimeTypes('application/vnd.google-apps.folder')
                .setSelectFolderEnabled(true);

            var picker = new google.picker.PickerBuilder()
                .addView(docsView)
                .enableFeature(google.picker.Feature.NAV_HIDDEN)
                .hideTitleBar()
                .setSize(DIALOG_DIMENSIONS.width - 2, DIALOG_DIMENSIONS.height - 2)
                .setOAuthToken(token)
                .setCallback(pickerCallback)
                .setOrigin('https://docs.google.com')
                .build();

            picker.setVisible(true);

        } else {
            showError('Unable to load the file picker.');
        }
    }

    /**
     * A callback function that extracts the chosen document's metadata from the
     * response object. For details on the response object, see
     * https://developers.google.com/picker/docs/result
     *
     * @param {object} data The response object.
     */
    function pickerCallback(data) {
        var action = data[google.picker.Response.ACTION];
        if (action == google.picker.Action.PICKED) {
            var doc = data[google.picker.Response.DOCUMENTS][0];
            var id = doc[google.picker.Document.ID];
            // Show the ID of the Google Drive folder
            document.getElementById('result').innerHTML = id;



        } else if (action == google.picker.Action.CANCEL) {
            google.script.host.close();
        }
    }

    function showError(message) {
        document.getElementById('result').innerHTML = 'Error: ' + message;
    }


            



  </script>
</head>

<body>
    <div>
        <p id='result'></p>
    </div>
    <script type="text/javascript" src="https://apis.google.com/js/api.js?onload=onApiLoad"></script>
</body>
</html>

function onOpen() {
 SpreadsheetApp.getUi().createMenu('Google Picker')
     .addItem('Choose Folder', 'showPicker')
     .addToUi();
}

/**
* Displays an HTML-service dialog in Google Sheets that contains client-side
* JavaScript code for the Google Picker API.
*/
function showPicker() {
 var html = HtmlService.createHtmlOutputFromFile('Picker.html')
     .setWidth(600)
     .setHeight(425)
     .setSandboxMode(HtmlService.SandboxMode.IFRAME);
 SpreadsheetApp.getUi().showModalDialog(html, 'Select Folder');
}

function getOAuthToken() {
 DriveApp.getRootFolder();
 return ScriptApp.getOAuthToken();
}



我想将两个 code.gs 文件与 picker.html 的 id 合并


function test(){
  var root = DriveApp.getFolderById("1fl7XeqwelnlJJnSQjjvDmdxYudfCwQAR");
  var list = [];

  var list = recurseFolder(root, list);
  //Logger.log(JSON.stringify(list));

  //This is just how I am testing the outputed list. You can do what you need.
  var sheet = SpreadsheetApp.getActiveSheet();
  //list.forEach(function (row){
  // sheet.appendRow(row); 
  //});
  Logger.log("test !\n")

}
var fileCounter = folderCounter = fileSize = 0;

function recurseFolder(folder, list){
  
  
  var files = folder.getFiles();  
  var subfolders = folder.getFolders();

  while (files.hasNext()){ //add all the files to our list first.
    var file = files.next();
    var row = [];
    fileCounter++;
    fileSize+=file.getSize();
    //Logger.log("File: " + folder.getName());
    //row.push(folder.getName(),file.getName(),file.getId(),file.getUrl(),file.getSize(),file.getDateCreated(),file.getLastUpdated())
    //list.push(row);
  }


  while (subfolders.hasNext()){   //Recurse through child folders.
    subfolder = subfolders.next(); 
    folderCounter++;
    //Logger.log("Folder: " + subfolder.getName());
    list = recurseFolder(subfolder, list); //Past the original list in so it stays a 2D Array suitible for inserting into a range.
  }  

  Logger.log ("file : " + fileCounter + " folderCounter : " + folderCounter + " fileSize : " +  fileSize);  

}

标签: javascriptgoogle-apps-script

解决方案


您可以使用gapiDrive API 并使用它来执行与 Apps 脚本中完全相同的逻辑。您可以阅读官方快速入门并对其进行修改以查询文件的大小,而不是简单地列出名称。

请注意,您必须加载authclientpicker。此外,您必须将选择器与其集成。

参考


推荐阅读