Google Apps Script获取图书封面失效,请求技术排查帮助
问题描述
我是Google Apps Script新手,为图书追踪工具编写了脚本,期望通过ISBN从Google Books获取对应图书封面。但当前脚本已失效,即使使用Google Books页面上存在的ISBN,仍提示“无对应封面”,附上代码寻求技术帮助:
function insertBookCover() { var sheetName = 'Books'; var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); if (sheet && sheet.getSheetName() === sheetName) { var isbnColumn = 4; var coverColumn = 5; var activeCell = sheet.getActiveCell(); var cellColumn = activeCell.getColumn(); if (cellColumn === isbnColumn) { var isbn = activeCell.getValue(); var imageUrl = getBookCoverUrl(isbn); if (imageUrl) { if (sheet.getMaxColumns() <= coverColumn) { sheet.insertColumnAfter(isbnColumn); } var imageUrlBlob = UrlFetchApp.fetch(imageUrl).getBlob(); activeCell.offset(0, 1).setValue(''); activeCell.offset(0, 1).setFormula('=image("' + imageUrl + '")'); } else { Logger.log('Kein Bild gefunden für ISBN: ' + isbn); } } else { Logger.log('Funktion sollte in Spalte ' + isbnColumn + ' aufgerufen werden.'); } } else { Logger.log('Tabellenblatt ' + sheetName + ' nicht gefunden oder nicht aktiv.'); } } function getBookCoverUrl(isbn) { var apiKey = '"my API Key!'; var apiUrl = 'https://www.googleapis.com/books/v1/volumes?q=isbn:' + isbn + '&key=' + apiKey + '&country=DE'; try { var response = UrlFetchApp.fetch(apiUrl, { 'muteHttpExceptions': true }); var data = JSON.parse(response.getContentText()); if (data.totalItems > 0) { return data.items[0].volumeInfo.imageLinks.thumbnail; } } catch (e) { Logger.log('Fehler beim Abrufen der Buchinformationen: ' + e); } return null; } function onEditTrigger(e) { insertBookCover(); }
问题排查与修复方案
你的脚本存在几个关键问题,以下是具体修复:
API Key格式错误
原代码中var apiKey = '"my API Key!';包含多余的双引号和感叹号,这会导致API请求鉴权失败。替换为你的实际API Key,格式应为:var apiKey = '你的Google Books API密钥';未处理封面数据缺失的情况
部分图书可能没有封面信息,直接访问imageLinks.thumbnail会抛出异常。需要逐层检查属性是否存在:if (data.totalItems > 0) { var volumeInfo = data.items[0].volumeInfo; if (volumeInfo && volumeInfo.imageLinks && volumeInfo.imageLinks.thumbnail) { return volumeInfo.imageLinks.thumbnail; } }优化触发器逻辑
原onEditTrigger没有利用事件对象e,依赖getActiveCell()可能导致触发不准确。修改为通过事件对象获取编辑的单元格,同时重构insertBookCover函数避免依赖全局状态。删除冗余代码
原代码中var imageUrlBlob = UrlFetchApp.fetch(imageUrl).getBlob();没有被使用,直接删除即可,减少不必要的网络请求。
修复后的完整代码
function insertBookCoverForCell(activeCell, sheet) { var isbnColumn = 4; var coverColumn = 5; var cellColumn = activeCell.getColumn(); if (cellColumn === isbnColumn) { var isbn = activeCell.getValue(); var imageUrl = getBookCoverUrl(isbn); if (imageUrl) { if (sheet.getMaxColumns() <= coverColumn) { sheet.insertColumnAfter(isbnColumn); } activeCell.offset(0, 1).setValue(''); activeCell.offset(0, 1).setFormula('=image("' + imageUrl + '")'); } else { Logger.log('Kein Bild gefunden für ISBN: ' + isbn); } } else { Logger.log('Funktion sollte in Spalte ' + isbnColumn + ' aufgerufen werden.'); } } function getBookCoverUrl(isbn) { var apiKey = '你的Google Books API密钥'; // 替换为实际密钥 var apiUrl = 'https://www.googleapis.com/books/v1/volumes?q=isbn:' + isbn + '&key=' + apiKey + '&country=DE'; try { var response = UrlFetchApp.fetch(apiUrl, { 'muteHttpExceptions': true }); var data = JSON.parse(response.getContentText()); if (data.totalItems > 0) { var volumeInfo = data.items[0].volumeInfo; // 逐层检查属性是否存在,避免报错 if (volumeInfo && volumeInfo.imageLinks && volumeInfo.imageLinks.thumbnail) { return volumeInfo.imageLinks.thumbnail; } } } catch (e) { Logger.log('Fehler beim Abrufen der Buchinformationen: ' + e); } return null; } function onEditTrigger(e) { var sheet = e.source.getSheetByName('Books'); var editedCell = e.range; if (sheet) { insertBookCoverForCell(editedCell, sheet); } else { Logger.log('Tabellenblatt Books nicht gefunden.'); } }
额外注意事项
- 确保你的Google Books API密钥已启用,并且没有超出请求配额。
- 检查ISBN格式是否正确(Google Books API支持带或不带连字符的ISBN)。
内容的提问来源于stack exchange,提问作者ben.swagner
相关产品推荐
相关产品推荐

