OBTENDO DADOS ESCUROS DO GOOGLE DRIVE — SEM API DO GOOGLE

Jan 04 2023
GOOGLE DRIVE | DOCUMENTOS WORD & PDF | SEM API DO GOOGLE Aprendemos como obter dados de arquivos, SQL localhost e SQL Server. E na maioria das vezes, em forma de mesa.

GOOGLE DRIVE | DOCUMENTOS WORD & PDF | SEM API DO GOOGLE

Aprendemos como obter dados de arquivos, SQL localhost e SQL Server. E na maioria das vezes, em forma de mesa. Mas e se precisarmos obter dados de documentos (word e pdf) armazenados no Google Drive? Então este artigo pode ser adequado para você, especialmente quando nenhuma configuração de API do Google é necessária!

Foto de Firmbee.com no Unsplash

Considere que você recebeu uma tarefa:

“Ei, eu tenho um monte de documentos que salvei no google drive, é possível ler todos aqueles arquivos word e pdf lá e resumir em uma tabela?”

Como um bom analista de dados como você é, com certeza você responderá, “claro”

Então vamos entrar nisso. primeiro, você precisará de um script que permita obter uma lista de arquivos dentro da pasta específica do google drives. Para fazer isso, você precisará criar uma nova planilha do Google, acessar a extensão e escolher o script Apps

Crie uma nova planilha do Google e escolha Apps Script

Isso levará você à guia de script de aplicativos.

Guia Script de aplicativos

em code.gs escreva o seguinte código. e substitua o var folderID pelo ID da pasta desejada. Tenho certeza que você sabe como. Sim, aquela string aleatória na sua barra de endereços.

// TODO: Set folder ID
var folderId = 'your folder id here';
var array=[];
var judul=['location','name','url','create date','update date'];
// Main function 2: List all files & folders, & write into the current sheet.
function listAll(){
  getFolderTree(folderId, true);   
};

// Get Folder Tree
function getFolderTree(folderId, listAll) {
  try {
    // Get folder by id
    var parentFolder = DriveApp.getFolderById(folderId);
    //go to 1st sheet
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[0]);
    // Initialise the sheet
    var file, data, sheet = SpreadsheetApp.getActiveSheet();
    sheet.clear();
    // Get files and folders
    getChildFolders(parentFolder.getName(), parentFolder, data, sheet, listAll);
  } 
  catch (e) {
    Logger.log(e.toString());
  }
};

// Get the list of files and folders and their metadata in recursive mode
function getChildFolders(parentName, parent, data, sheet, listAll) {
  var childFolders = parent.getFolders();
  // List folders inside the folder
    while (childFolders.hasNext()) {
    var childFolder = childFolders.next();
    
    // List files inside the folder
    var files = childFolder.getFiles();
    while (listAll & files.hasNext()) {
      var childFile = files.next();
      //Logger.log("File Name: " + childFile.getName());
      data = [ 
        parentName + "/" + childFolder.getName() + "/" + childFile.getName(),
        childFile.getName(),
        childFile.getId(),
        childFile.getUrl(),
        childFile.getDateCreated(),
        childFile.getLastUpdated(),
      ];
      // Write
      array.push(data);
    }
    // Recursive call of the subfolder
    //Logger.log(array);
    getChildFolders(parentName + "/" + childFolder.getName(), childFolder, data, sheet, listAll);  
        SpreadsheetApp.getActiveSheet().getRange(1, 1, 1, 1).setValue('location');
        SpreadsheetApp.getActiveSheet().getRange(1, 2, 1, 1).setValue('name');
        SpreadsheetApp.getActiveSheet().getRange(1, 3, 1, 1).setValue('id');
        SpreadsheetApp.getActiveSheet().getRange(1, 4, 1, 1).setValue('url');
        SpreadsheetApp.getActiveSheet().getRange(1, 5, 1, 1).setValue('DateCreated');
        SpreadsheetApp.getActiveSheet().getRange(1, 6, 1, 1).setValue('LastUpdated');
        SpreadsheetApp.getActiveSheet().getRange(2, 1, array.length, 6).setValues(array);
  };
 
};

Esta é a primeira tabela em que precisamos localizar onde estão todos os documentos. E para isso, faremos isso usando python. Para fazer isso é escrever o seguinte código:

import pandas as pd
import textract
import re

#get sheet id
sheet_id='your sheed id here'
#convert google sheet to csv for easy handling
csv_url=(f"https://docs.google.com/spreadsheets/d/{sheet_id}/export?format=csv")
#create dataframe from csv
df=pd.read_csv(csv_url)
#filter by filetype
desiredfiletype=[".pdf",".doc",".docx"]
df=df[df['name'].str.contains('|'.join(desiredfiletype))]

#drop na
df=df.dropna()
#create new column "text"
df["text"]=""
#create new column url
df["url_final"]=""

for index, row in df.iterrows():
    if str(row['name'])[-4:] == ".pdf":
        df['url_final']=df['url']
    else: 
        df['url_final']="http://docs.google.com/document/d/"+df['id']+"/export?format=pdf"

#remove url column
del df['url']

df

E para o documento word (.doc e .docx), prefiro baixá-lo primeiro em pdf. Isso tornará mais fácil para o python ler seu conteúdo. Mas primeiro, precisamos baixá-lo para nossa pasta usando este código. Para fazer isso, você precisará de duas bibliotecas: gdown e requests.

import gdown
import requests

for index, value in df['url_final'].items():
    try:
        url = value
        r = requests.get(url)
        if r.status_code == 200:
            output=r"D:/Documents/ISA/"+ df["name"][index]+".pdf"
            gdown.download(url,output,fuzzy=True)    
    except:
        pass

import gdown
import PyPDF2
import requests

for index, value in df['url'].items():
    try:
        #read pdf
        output=r"D:/Documents/"+ df["name"][index]+".pdf"
        pdfFileObject = open(output, 'rb')
        pdfReader = PyPDF2.PdfFileReader(pdfFileObject)
        count = pdfReader.numPages
        text=""
        for i in range(count):
            page = pdfReader.getPage(i)
            text += page.extractText() +"\n"
        df["text"][index]=text
    except:
        pass


Tenho certeza de que a API do Google é ótima, mas para alguns como eu, definir projetos, credenciais, JSON etc. às vezes é demais. especialmente quando há uma alternativa que fornecerá o mesmo resultado.