VBA Excel - Google Books API - Como obter dados de uma lista de livros com ISBN no Excel



|Blog Office VBA | Blog Excel | Blog Access | Blog Infochart | 



O título deste post poderia ser 'Getting data about a book using the ISBN number', mas achei melhor o título somente em português:

Google Books API - Como obter dados de uma lista de livros com ISBN no Excel

Acho que exprimirá melhor a intenção do conteúdo abaixo. Desenvolvi este conteúdo, não tanto pela utilidade prática em si, a qual não é totalmente inútil, uma vez que podemos consultar uma ampla lista de títulos de livros de uma planilha Excel, por exemplo, num dos maiores repositórios de dados sobre livros no mundo.

Minha verdadeira intenção é a de estimular a constante interação com dados oriundos da Web, neste caso a interação com a excelente API do Google Books.

É desnecessário dizer que esse código poderia ser implementado em qualquer produto da suíte MS Office, ou fora dela, que processe um código VBA.

Google Book API

Olharemos para a forma como  a API do Google Books responde a um pedido detalhado a partir do respectivo número ISBN de um livro. Usando esses dados, completaremos as colunas da nossa planilha. 

O Google oferece uma API rica e subutilizada. Neste exemplo vamos usar uma pequena parte dela para resolver um problema específico que os bibliotecários muitas vezes têm:

Como obter dados de uma lista de livros com ISBN no Excel?

Implementando o código no Excel

Digamos que precisemos completar uma tabela de números de ISBN, preenchendo várias outras colunas com atributos a partir deste número. 

A tabela completa será similar a esta:


O nosso código buscará uma coluna com o título ISBN que será usado como o pedido de livros à biblioteca do Google. Quaisquer outras colunas que correspondam aos nomes de campos retornados pelo Google serão preenchidas. Nos casos em que existam potencialmente vários valores (por exemplo, autores), serão separados por vírgulas. Todas as colunas cujas as posições não correspondam aos campos retornados pelo Google Books serão ignorados e o seu conteúdo ficará intacto.

Onde obter o código

Criaremos um módulo chamado 'isbnExample' na planilha.

Resumo dos dados

O primeiro passo  é fazer com que a tabela de entrada / saída seja abstraída da sua posição física usando classes de manipulação de dados. Em seguida, verificamos se há a coluna ISBN, processamos a tabela contra a API do Google Books, e, finalmente, atualizamos a planilha.

Public Sub isbnExample()
    Dim dSet As cDataSet
    
    Set dSet = New cDataSet
    
    With dSet
        ' criar um conjunto de dados (recordset) na planilha ISBN
        .populateData wholeSheet("isbn"), , "isbn", , , , True

        If .where Is Nothing Then
            MsgBox ("Nenhuma informação para processar...")
        Else
            'verifique temos a coluna ISBN presente
            If .headingRow.validate(True, cISBNColumnHeading) Then
                ' se não houvesse nenhuma atualização então executa o commit
                If processISBN(dSet) > 0 Then
                    .bigCommit
                End If
                
            End If
        End If
    End With
    
    Set dSet = Nothing
End Sub

Obtendo respostas da API do Google Books

Cada linha da planilhas será passada para a API com uma consulta ao número ISBN, e retornará uma string de tudo o que o Google encontrar sobre o livro.

Private Function processISBN(ds As cDataSet) As Long
    Dim dSet As cDataSet, cb As cBrowser, dr As cDataRow
    Dim jo As cJobject, job As cJobject, n As Long
    Dim sWire As String
    
    ' Recebe detalhes dum livro pelo número de ISBN.
    Set cb = New cBrowser
    Set jo = New cJobject
    
    Let n = 0
    
    For Each dr In ds.rows
        With dr.cell(cISBNColumnHeading)
            Let sWire = cb.httpGET(cISBNGoogleBooks & .toString)
            
            Set job = jo.deSerialize(sWire)
            
            If Not job.isValid Then
                MsgBox ("Código ISBN incorreto! " & .toString & "-" _
                    & sWire)
            
            ElseIf Not job.childExists("error") Is Nothing Then
            
                MsgBox ("O Google Books recusa-se operar com este ISBN " _
                        & .toString _
                        & "-" & job.child("error").serialize)
                
            ElseIf job.childExists("Items") Is Nothing _
                Or job.childExists("totalItems") Is Nothing Then
                
                MsgBox ("Não foi encontrado nenhuma informação para este ISBN " _
                        & .toString _
                        & "-" & job.serialize)
            
            ElseIf job.child("totalItems").value <> 1 Then
            
                MsgBox ("Múltiplas entradas para " _
                        & .toString _
                        & "-" & job.child("totalItems").serialize)
            
            Else
                ' Preenche a linha.
                Let n = n + rowProcess(dr, job.child("Items"))
            End If
        End With
    Next dr
    
    Let processISBN = n
End Function

Preenchendo as colunas com os dados retornados

Para cada linha que havíamos executado uma consulta, verificaremos se há qualquer nome de coluna correspondente aos nomes dos campos de resposta da consulta, e os preencheremos, então lidaremos com as várias colunas, separando-as nos vários valores por vírgulas.

Private Function rowProcess(dr As cDataRow, job As cJobject) As Long
    Dim hc As cCell, n As Long, jo As cJobject, jom As cJobject
    
    Let n = 0
    
    For Each hc In dr.parent.headings
        ' Quaisquer títulos que estiverem presentes no conjunto de dados retornados
        ' no json serão preenchidos.
        
        With hc
            If .toString <> cISBNColumnHeading Then
                Set jo = job.find(.toString)
                
                If Not jo Is Nothing Then
                    With dr.cell(.column)
                        ' Se forem múltiplas, inclue na matriz (array) separados por vírgulas
                        If jo.isArrayRoot Then
                            Let .value = vbNullString
                            
                            If jo.hasChildren Then
                                For Each jom In jo.children
                                    If .toString <> vbNullString Then
                                        Let .value = .value & ","
                                    End If
                                    
                                    Let .value = .value & jom.toString
                                Next jom
                            End If
                        Else
                            Let .value = jo.value
                        End If
                    End With
                    
                    Let n = n + 1
                End If
            End If
        End With
    Next hc
    
    Let rowProcess = n
End Function

Lembre-se que estamos apenas arranhando a superfície desta excelente API. Você poderia facilmente usar outros recursos para criar todos os tipos de consultas sofisticadas a partir do ISBN

Como sempre estou ansioso para o seu feedback, comentários e perguntas.

O que é ISBN?

International Standard Book Number, mais conhecido pela sua sigla ISBN, é o Número Padrão Internacional de Livro: um sistema identificador único para livros e publicações não periódicas. Foi criado no Reino Unido, em 1967, pela livraria W H Smith, sendo chamado inicialmente de "Standard Book Numbering" (SBN). Desde então, passou a ser amplamente empregado tanto pelos comerciantes de livros quanto pelas bibliotecas, até que, em 1972, a International Organization for Standardization transformou-o em uma norma padrão internacional: a ISO 2108.



Emissão de ISBN

A emissão dos números ISBN é específico de cada país e é adaptado aos objetivos nacionais de cada um. No Canadá, a emissão de ISBN é efetuada sem custos, tendo como objetivo estimular a cultura. No Reino Unido e Estados Unidos, a emissão do ISBN tornou-se um centro de lucro para as empresas responsáveis. Editores e autores devem portanto obter os números ISBN da agência nacional de cada pais. Uma lista de agências ISBN está disponível no site da International ISBN Agency.

Outros acrônimos conhecidos:

ASIN (Amazon Standard Identification Number)
CODEN (Publicações periódicas; substituído pelo ISSN para publicações actuais)
DOI (Digital Object Identifier)
ESTC (English Short Title Catalogue)
ETTN (Electronic Textbook Track Number)
ISAN (International Standard Audiovisual Number)
ISMN (International Standard Music Number)
ISWC (International Standard Musical Work Code)
ISRC (International Standard Recording Code)
ISSN (International Standard Serial Number)
ISWN (International Standard Wine Number)
LCCN (Library of Congress Control Number)
OCLC (Online Computer Library Center number)
SICI (Serial Item and Contribution Identifier)

Tags: W H Smith, Tips, Google, API, Excel, VBA, Google Books, ISBN, 




Um comentário:

  1. Esse script não funciona. Precisa de funções como cDataSet que não estão aqui. Além de outras. Onde conseguir tudo necessário para rodar o script?

    ResponderExcluir

diHITT - Notícias