OBTENER DATOS OSCUROS DE GOOGLE DRIVE - SIN API DE GOOGLE

Jan 04 2023
UNIDAD DE GOOGLE | DOCUMENTOS WORD Y PDF | SIN API DE GOOGLE Hemos aprendido cómo obtener datos de archivos, SQL localhost y SQL Server. Y la mayoría de las veces, en forma de mesa.

UNIDAD DE GOOGLE | DOCUMENTOS WORD Y PDF | SIN API DE GOOGLE

Hemos aprendido a obtener datos de archivos, SQL localhost y SQL Server. Y la mayoría de las veces, en forma de mesa. Pero, ¿y si necesitamos obtener datos de documentos (word y pdf) almacenados en Google Drive? Entonces este artículo podría ser adecuado para usted, ¡especialmente cuando no se requiere una configuración de API de Google!

Foto de Firmbee.com en Unsplash

Considere que se le asigna una tarea:

"Oye, tengo un montón de documentos que guardé en Google Drive, ¿es posible leer todos esos archivos Word y PDF allí y resumirlos en una tabla?"

Como buen analista de datos que eres, seguro que responderás, “seguro”

Así que entremos en eso. Primero, necesitará una secuencia de comandos que le permita obtener una lista de archivos dentro de la carpeta específica de Google Drive. Para hacer esto, deberá crear una nueva hoja de cálculo de Google, ir a la extensión y elegir el script de aplicaciones.

Cree una nueva hoja de cálculo de Google y elija Apps Script

Esto lo llevará a la pestaña de script de aplicaciones.

Pestaña Script de aplicaciones

en code.gs escribe el siguiente código. y reemplace el ID de carpeta var con el ID de carpeta deseado. Estoy seguro de que sabes cómo. Sí, esa cadena aleatoria en tu barra de direcciones.

// 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 es la primera tabla en la que debemos ubicar dónde están todos los documentos. Y para eso, lo haremos usando python. Para ello es escribir el siguiente 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

Y para el documento de Word (.doc y .docx), prefiero descargarlo primero en pdf. Esto facilitará que Python lea su contenido. Pero primero, necesitamos descargarlo a nuestra carpeta usando este código. Para hacer esto, necesitará dos bibliotecas: gdown y solicitudes.

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


Estoy seguro de que la API de Google es excelente, pero para algunos como yo, configurar proyectos, credenciales, JSON, etcétera, a veces es demasiado. especialmente cuando hay una alternativa que entregará el mismo resultado.