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

请求协助完善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}的预订数据`);
}

使用说明:

  1. 配置基础信息:先替换代码顶部的BEDS24_USERNAME、BEDS24_PASSWORD和TARGET_SHEET_NAME为你自己的信息。
  2. 首次全量导入:执行importBookingsByYearRange函数,传入起始和结束年份(比如importBookingsByYearRange(2019, 2024)),如果是首次导入可以启用sheet.clearContents()清空工作表后写入。
  3. 后续增量更新:每天执行importBookingsBySingleDay函数,传入当天日期(比如importBookingsBySingleDay("2024-05-20")),或者设置时间驱动触发器自动每日运行。

关键优化点:

  • 用POST请求传递认证和参数(符合Beds24 API的要求,原代码用了GET导致参数无法传递)
  • 拆分通用API请求函数,避免代码重复
  • 支持CSV解析与Sheets写入的两种模式(覆盖/追加)
  • 添加错误处理与用户提示
  • 参数化日期范围,灵活支持年份和单日导入

内容的提问来源于stack exchange,提问作者Jamryl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:07:50