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

如何通过Google Apps Script更新Firestore自动生成ID的文档

修复Google Sheets到Firestore同步更新问题的方案

核心问题分析

现有代码存在三个关键问题:

  • main函数调用updateFirestoreDocument时,documentId和data变量未定义,直接调用会报错
  • 未在Sheet中存储Firestore自动生成的DocumentID,无法匹配目标更新文档
  • updateFirestoreDocument未针对单条记录做遍历处理,逻辑调用错误

解决方案步骤

1. 调整Google Sheets结构

在表格最左侧新增一列,表头命名为firestoreId,用于存储每条记录对应的Firestore自动生成ID。后续创建文档后会自动写入该ID,更新时通过此字段匹配Firestore文档。

2. 修改代码实现

修正main函数

遍历每条记录,针对单个记录调用更新逻辑,同时处理ID回写:

function main() {
  var email = "fireb...ccount.com";
  var key = "-----BEGI...rxEp...RIVATE KEY-----\n";
  var projectId = "co...t";
  
  var sheet = SpreadsheetApp.getActiveSheet();
  var sheetName = sheet.getName();
  var properties = getProperties(sheet);
  var records = getRecords(sheet);
  
  var firestore = FirestoreApp.getFirestore(email, key, projectId);
  
  // 逐条处理记录的更新/创建
  records.forEach(function(record, index) {
    var data = {};
    properties.forEach(function(prop, i) { data[prop] = record[i]; });
    
    // 从记录中获取已存储的Firestore文档ID
    var documentId = data.firestoreId;
    
    // 调用更新函数,获取新生成的ID(如果是新建文档)
    var newDocId = updateFirestoreDocument(firestore, sheetName, documentId, properties, data);
    
    // 若为新建文档,将自动生成的ID写回Sheet对应行
    if (newDocId && documentId === "") {
      sheet.getRange(index + 3, 1).setValue(newDocId);
    }
  });
}

修正updateFirestoreDocument函数

处理单条记录的更新/创建逻辑,返回新生成的ID以便回写:

function updateFirestoreDocument(firestore, collectionName, documentId, properties, data) {
  // 移除无需存入Firestore的firestoreId字段
  delete data.firestoreId;
  
  if (documentId && documentId !== "") {
    var documentRef = firestore.getDocument(collectionName, documentId);
    if (documentRef.exists()) {
      // 批量更新所有字段,提升效率
      documentRef.updateData(data);
      return null;
    } else {
      // ID存在但文档不存在时,创建对应ID的文档
      firestore.createDocument(collectionName, documentId, data);
      return documentId;
    }
  } else {
    // 无ID时创建新文档,返回自动生成的ID
    var newDoc = firestore.createDocument(collectionName, data);
    return newDoc.getId();
  }
}

调整exportToFirestore函数(可选,可合并到main逻辑)

若保留导出功能,修改为创建后自动写入ID:

function exportToFirestore(firestore, collectionName, properties, records) {
  var sheet = SpreadsheetApp.getActiveSheet();
  records.forEach(function(record, index) {
    var data = {};
    properties.forEach(function(prop,i) { data[prop] = record[i]; }); 
    if (data[properties[0]] === undefined || data[properties[0]] === null) {
      return;
    }
    
    delete data.firestoreId;
    var newDoc = firestore.createDocument(collectionName, data);
    // 将生成的ID写回Sheet对应行
    sheet.getRange(index + 3, 1).setValue(newDoc.getId());
  });
}

保留原有工具函数(无需修改)

function onOpen() {
  SpreadsheetApp.getUi().createMenu('🔥 Firebase')
  .addItem('⏪ Export to Firestore', 'main')
  .addItem('⏩ Import from Firestore', 'menuImport')
  .addToUi();
}

function getProperties(sheet){
  return sheet.getRange(2, 1, 1, sheet.getLastColumn()).getValues()[0];
}

function getRecords(sheet) {
  var data = sheet.getDataRange().getValues();
  var dataToImport = [];
  for (var i = 2; i < data.length; i++) {
    dataToImport.push(data[i]);
  }
  return dataToImport;
}

关键说明

  • 通过Sheet存储firestoreId,解决了自动生成ID无法匹配更新的核心问题
  • 批量更新字段减少Firestore调用次数,提升同步效率
  • 新建文档后自动回写ID,确保后续更新能精准匹配目标文档

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:30:45