O Google Docs estará cheio em 1º de junho. Escrevemos um script para contornar essa limitação

Fundo

O Google mudará sua política de retenção de dados a partir de 1º de junho de 2021 . Resumindo: os documentos e as fotos agora se tornarão completos e serão levados em conta na cota total de 15GB. Além disso, se sua conta estiver inativa por mais de dois anos, o Google pode excluir seus dados.





Eu trabalho muito com o Google Docs e, com uso pesado, minha cota de disco se esgota muito rapidamente. Mas há boas notícias: os documentos criados antes de junho de 2021 1 , então, e permanecem sem peso , para que você não receba uma violação de cota durante a noite.





Imediatamente tive a ideia de deixar os documentos "em estoque". Abaixo, direi como isso pode ser feito sem gastar muito tempo e esforço.





Escrever um script que cria documentos

Vou escrever o script usando o Google Apps Script.





Crie uma nova planilha do Google, vá para o editor de scripts ( Ferramentas - Editor de scripts ).





Crie três arquivos





  • main.gs - o código principal para a criação de arquivos





  • menu.gs - código para criar um menu personalizado ao abrir uma mesa





  • index.html -





menu.gs onOpen(). , . - , .





function onOpen(e) { 												//    
  SpreadsheetApp.getUi() 										//   
      .createMenu('')										//  
      .addItem(' ', 'main') //   
      .addToUi();														//    
}
      
      



main.gs main(), .





function main() { //  -  
  //  HTML   
  let template = HtmlService.createTemplateFromFile(`index`);
  //     HTML 
  SpreadsheetApp.getUi()
    .showModelessDialog(template.evaluate(),` ...`);
}
      
      



index.html. HTML , . , ..





index.html
<!doctype html>
<html lang="en">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">

    <script>
      let timer = function(){ //  
        //   
        let now = (new Date()).getTime();
        
        //     - 1   
        setInterval(function(){
          //   . now   - .
          let time = (new Date()).getTime() - now;
          //  
          let minutes = Math.floor(time/60000);
          //  
          let seconds = Math.floor(time%60000/1000);
          //     lifeTime
          updateData("lifeTime", `${minutes<10?"0"+minutes:minutes}:${seconds<10?"0"+seconds:seconds}`);
        },1000);
      };
      
      updateData = function(id, value){ //       id
        let element = document.getElementById(id);
        if (element) {
          element.innerHTML = value;
        };
      };
      
      refreshData = function(){ //   
        google.script.run.withSuccessHandler(function(data){
        updateData("createTables", data.createTables); 	//  :
        updateData("createDocs", data.createDocs);			//  :
        updateData("createForms", data.createForms);		//  
        updateData("createSlides", data.createSlides);	//  
        updateData("log", data.log);										// 
      }).getData(); //   
    };

      setTimeout(setInterval(refreshData, 2000),1000); 	//     2 
      timer();																					//  
      google.script.run.doMagic();								//     
    </script>
  </head>
  <body>
    <div class=".container bg-dark text-white text-center">
      <div class="row">
        <div class="col">
          
        </div>        
        <div class="col">
          
        </div>        
        <div class="col">
          
        </div>        
        <div class="col">
          
        </div>
      </div>
      <div class="row">
        <div class="col" id="createTables">
          0
        </div>
        <div class="col" id="createDocs">
          0
        </div>        
        <div class="col" id="createForms">
          0
        </div>        
        <div class="col" id="createSlides">
          0
        </div>
      </div>
    </div>    
     <div class=".container bg-dark text-white">
      <div class="row">
        <div class="col text-right" id="label_lifeTime">
           :  
        </div>        
        <div class="col  text-left" id="lifeTime">
          00:00
        </div>        
      </div>
    </div>

    <div bg-dark text-white id="label_log">: </div>
    <ul class="list-group" id="log">
    </ul>
  </body>
</html>

      
      



, , :





  • updateData(id, value) - id





  • refreshData() - ,





  • timer() -





main.gs .





function create()
const FILES_TO_CREATE = 50;

function create(filesToCreate = FILES_TO_CREATE, folderId, prefix="file_", app, key) {
  //   -   .
  let props = PropertiesService.getScriptProperties();
  //     data.   
  let data = JSON.parse(props.getProperty(`data`));

  try{
    //    id
    let folder = DriveApp.getFolderById(folderId);
    for(var i=0; i<filesToCreate; i++){ //  filesToCreate 
      //  ,   id
      let ssId = app.create(`${prefix}${(new Date()).getTime()}`).getId();
      //     id
      let ss = DriveApp.getFileById(ssId);
      //    
      folder.addFile(ss);
      //     
      DriveApp.getRootFolder().removeFile(ss);

      //    
      data[key]=1+data[key];
      //   
      props.setProperty(`data`, JSON.stringify(data));
    };
  }catch(err){
    //    -    
    logToHtml(`Error: ${err}`, LOG_TYPES.danger);
  };
  //      
  return +i;
};
      
      



- , , .





create()
function createSheets(key) {
  //  id   
  let folderId =  PropertiesService.getScriptProperties().getProperty(`sheetsFolder`);
  //    
  let count = create(FILES_TO_CREATE, folderId, `sheet_`, SpreadsheetApp, key);
  //   
  logToHtml(`${count} sheets were created`, LOG_TYPES.success);
}

function createDocs(key) {
  let folderId =  PropertiesService.getScriptProperties().getProperty(`docsFolder`);
  let count = create(FILES_TO_CREATE, folderId, `doc_`, DocumentApp, key);
  logToHtml(`${count} docs were created`, LOG_TYPES.success);
}

function createForms(key) {
  let folderId =  PropertiesService.getScriptProperties().getProperty(`formsFolder`);
  let count = create(FILES_TO_CREATE, folderId, `form_`, FormApp, key);
  logToHtml(`${count} forms were created`, LOG_TYPES.success);
}

function createSlides(key) {
  let folderId =  PropertiesService.getScriptProperties().getProperty(`slidesFolder`);
  let count = create(FILES_TO_CREATE, folderId, `slide_`, SlidesApp, key);
  logToHtml(`${count} slides were created`, LOG_TYPES.success);
}
      
      



.





function createFolders(){
  //   -   
  let props = PropertiesService.getScriptProperties();

  //   
  let folders = [
    {key:`rootFolder`,   name:``                         },
    {key:`sheetsFolder`, name:`Sheets`, parentFolder:`rootFolder`},
    {key:`docsFolder`,   name:`Docs`,   parentFolder:`rootFolder`},
    {key:`formsFolder`,  name:`Forms`,  parentFolder:`rootFolder`},
    {key:`slidesFolder`, name:`Slides`, parentFolder:`rootFolder`},
    ];

  //      
    folders.forEach(folder=>{
      if (!props.getProperty(folder.key)){ //     
        //    rootFolder,   ,    
        let parentFolder = folder.parentFolder?DriveApp.getFolderById(props.getProperty(folder.parentFolder)):DriveApp.getRootFolder();
        //  
        let folderId = parentFolder.createFolder(folder.name).getId();
        //    
        props.setProperty(folder.key, folderId);
      };
    });
}
      
      



:





,
function doMagic(){
  let props = PropertiesService.getScriptProperties();

  //  
  let data = {
    createTables:0, 
    createDocs:0, 
    createForms:0, 
    createSlides:0, 
    startTime:new Date(),
    log:``,
  };

  //     
  props.setProperty(`data`, JSON.stringify(data));
  
  try{
    createFolders(); 							//  
    createSheets(`createTables`);	//  
    createDocs(`createDocs`);			//  
    createForms(`createForms`);		//  
    createSlides(`createSlides`);	//  
    
    // ,   
    SpreadsheetApp.getUi().alert(`!`);
  }catch(err){
    //     
    SpreadsheetApp.getUi().alert(`! ${err}`);
  };
};
      
      



- .





function getData(){ //    
  //   -
  let props = PropertiesService.getScriptProperties();
  //       
  let data = JSON.parse(props.getProperty(`data`));
  return data; // 
};
      
      



:





const LOG_TYPES = { //  .   bootstrap
  primary:   "primary",
  secondary: "secondary",
  success:   "success",
  danger:    "danger",
  warning:   "warning",
  info:      "info",  
};

function logToHtml(log, type = LOG_TYPES.primary){
  //  
  let data = getData();
  //  li  (    )  
  data.log+=`<li class="list-group-item text-${type}">${log}</li>\n`;
  //  
  let props = PropertiesService.getScriptProperties();
  props.setProperty(`data`, JSON.stringify(data));
};
      
      



. Google - . , .





Janela modal para visualizar o progresso

  • 6 . . , HTML API,





  • . Exception: : docs create.






TL;DR

Reuni todos os itens acima em uma tabela que você pode copiar para você mesmo ( Arquivo - Criar uma cópia ), executar ( Menu - Criar arquivos ) e obter várias centenas de arquivos em seu disco. Repita o procedimento se necessário.





Obrigado pela atenção. Eu ficaria feliz em receber comentários sobre o código. Boa sorte!








All Articles