You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
}
问题排查与修复方案

你的脚本存在几个关键问题,以下是具体修复:

  1. API Key格式错误
    原代码中var apiKey = '"my API Key!';包含多余的双引号和感叹号,这会导致API请求鉴权失败。替换为你的实际API Key,格式应为:

    var apiKey = '你的Google Books API密钥';
    
  2. 未处理封面数据缺失的情况
    部分图书可能没有封面信息,直接访问imageLinks.thumbnail会抛出异常。需要逐层检查属性是否存在:

    if (data.totalItems > 0) {
      var volumeInfo = data.items[0].volumeInfo;
      if (volumeInfo && volumeInfo.imageLinks && volumeInfo.imageLinks.thumbnail) {
        return volumeInfo.imageLinks.thumbnail;
      }
    }
    
  3. 优化触发器逻辑
    原onEditTrigger没有利用事件对象e,依赖getActiveCell()可能导致触发不准确。修改为通过事件对象获取编辑的单元格,同时重构insertBookCover函数避免依赖全局状态。

  4. 删除冗余代码
    原代码中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:08:19