请求协助完善Google Script实现Beds24 API CSV数据导入Google Sheets
完善Beds24 API CSV数据导入Google Sheets的脚本
我来帮你修复并优化这段Google Apps Script代码,实现按年份全量导入和单日增量更新的需求。先拆解下原代码的核心问题:
- 函数语法错误(比如
var var bookings的重复声明)、结构混乱 - 认证信息没有正确传递到API请求中
- 缺少CSV解析与写入Google Sheets的关键逻辑
- 没有实现日期范围的参数化过滤
下面是修正后的完整代码,包含两个核心功能函数,以及通用的API请求辅助函数:
// 配置你的Beds24账号信息 const BEDS24_USERNAME = "你的Beds24用户名"; const BEDS24_PASSWORD = "你的Beds24密码"; const TARGET_SHEET_NAME = "预订数据"; // 目标工作表名称 /** * 通用函数:调用Beds24 CSV API获取数据 * @param {Object} params 请求参数(如日期范围) * @return {string} 返回的CSV文本内容 */ function fetchBeds24CSV(params = {}) { const apiUrl = "https://www.beds24.com/api/csv/getbookingscsv"; // 构建认证与请求参数 const payload = { authentication: { username: BEDS24_USERNAME, password: BEDS24_PASSWORD }, ...params // 合并传入的日期等参数 }; // 发送POST请求(Beds24 API要求用POST传递参数) const options = { method: "POST", contentType: "application/json", payload: JSON.stringify(payload) }; try { const response = UrlFetchApp.fetch(apiUrl, options); return response.getContentText(); } catch (error) { throw new Error(`API请求失败: ${error.message}`); } } /** * 功能1:按年份范围导入全量历史数据 * @param {number} startYear 起始年份(如2020) * @param {number} endYear 结束年份(如2024) */ function importBookingsByYearRange(startYear, endYear) { // 构建日期范围参数:YYYY-01-01 到 YYYY-12-31 const params = { start: `${startYear}-01-01`, end: `${endYear}-12-31` }; // 获取CSV数据 const csvContent = fetchBeds24CSV(params); // 解析CSV为二维数组 const csvData = Utilities.parseCsv(csvContent); // 写入到Google Sheets const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(TARGET_SHEET_NAME); if (!sheet) { throw new Error(`未找到名为${TARGET_SHEET_NAME}的工作表,请创建后重试`); } // 清空已有数据(首次全量导入时可启用,增量更新请注释) // sheet.clearContents(); // 将数据写入工作表:从第一行第一列开始,覆盖已有内容(或追加) // 若要追加数据,可使用sheet.getLastRow() + 1作为起始行 sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData); SpreadsheetApp.getUi().alert(`成功导入${csvData.length - 1}条预订数据(含表头)`); } /** * 功能2:按单日导入新增数据 * @param {string} targetDate 目标日期(格式:YYYY-MM-DD,如"2019-09-29") */ function importBookingsBySingleDay(targetDate) { // 构建单日范围参数:当天00:00到23:59 const params = { start: `${targetDate} 00:00`, end: `${targetDate} 23:59` }; // 获取CSV数据 const csvContent = fetchBeds24CSV(params); const csvData = Utilities.parseCsv(csvContent); if (csvData.length <= 1) { SpreadsheetApp.getUi().alert(`${targetDate}没有新增预订数据`); return; } // 写入到Google Sheets(追加模式,避免覆盖已有数据) const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(TARGET_SHEET_NAME); if (!sheet) { throw new Error(`未找到名为${TARGET_SHEET_NAME}的工作表,请创建后重试`); } const lastRow = sheet.getLastRow(); // 跳过表头,只导入数据行 const dataRows = csvData.slice(1); sheet.getRange(lastRow + 1, 1, dataRows.length, dataRows[0].length).setValues(dataRows); SpreadsheetApp.getUi().alert(`成功追加${dataRows.length}条${targetDate}的预订数据`); }
使用说明:
- 配置基础信息:先替换代码顶部的
BEDS24_USERNAME、BEDS24_PASSWORD和TARGET_SHEET_NAME为你自己的信息。 - 首次全量导入:执行
importBookingsByYearRange函数,传入起始和结束年份(比如importBookingsByYearRange(2019, 2024)),如果是首次导入可以启用sheet.clearContents()清空工作表后写入。 - 后续增量更新:每天执行
importBookingsBySingleDay函数,传入当天日期(比如importBookingsBySingleDay("2024-05-20")),或者设置时间驱动触发器自动每日运行。
关键优化点:
- 用POST请求传递认证和参数(符合Beds24 API的要求,原代码用了GET导致参数无法传递)
- 拆分通用API请求函数,避免代码重复
- 支持CSV解析与Sheets写入的两种模式(覆盖/追加)
- 添加错误处理与用户提示
- 参数化日期范围,灵活支持年份和单日导入
内容的提问来源于stack exchange,提问作者Jamryl
相关产品推荐
相关产品推荐

