Google Apps Script:创建Google Doc时如何设置文档级属性?
问题描述
我正在开发一个Google Apps Script项目,该脚本接收参数并创建新的Google Doc,以POST API形式对外提供服务。我希望将部分请求参数存储在文档级或用户级Property Store中,但根据文档说明,PropertyService.getUserProperties()和PropertyService.getDocumentProperties()仅在用户打开活跃文档时才返回有效对象。请问是否有办法在创建文档的同时设置文档级属性?期望实现的操作类似以下代码:
function doPost(e) { var requestData = JSON.parse(e.postData.contents); var documentName = requestData.documentName; var documentExtId = requestData.documentExtId; var result = createDoc(documentName, documentExtId); return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType.JSON); } function createDoc(documentName, documentExtId) { // 创建新的Google Doc var doc = DocumentApp.create(documentName); // 获取创建的文档ID var docId = doc.getId(); // 获取文档编辑URL var docUrl = 'https://docs.google.com/document/d/' + docId + '/edit'; // 我希望能执行类似这样的操作.... PropertiesService.getDocumentProperties().setProperty("documentExtId", documentExtId); // 返回URL return { url: docUrl }; }
解决方案
你当前的代码无法实现需求,因为PropertiesService.getDocumentProperties()获取的是当前运行脚本所在项目的文档属性(你的Web App是独立脚本项目,不是绑定到新创建Doc的脚本),而非新创建的Google Doc的文档级属性。以下是两种可行的实现方式:
方法1:使用Drive API的文件自定义属性
这是最直接的方案,Drive API允许给任何Drive文件添加自定义键值对属性,无需依赖文档绑定脚本。
步骤:
- 在你的Apps Script项目中,启用Drive API:点击编辑器菜单「资源」>「高级Google服务」,找到Drive API并开启。
- 修改
createDoc函数,添加设置自定义属性的代码:
function createDoc(documentName, documentExtId) { // 创建新的Google Doc var doc = DocumentApp.create(documentName); var docId = doc.getId(); var docUrl = 'https://docs.google.com/document/d/' + docId + '/edit'; // 使用Drive API设置文件自定义属性 Drive.Files.patch( { properties: { documentExtId: documentExtId } }, docId, { fields: 'properties' } ); return { url: docUrl }; }
读取属性的方式:
如果后续需要读取该属性,可以通过Drive API获取:
function getDocumentExtId(docId) { var file = Drive.Files.get(docId, { fields: 'properties' }); return file.properties ? file.properties.documentExtId : null; }
方法2:使用绑定脚本的文档级PropertyService
如果必须使用PropertyService.getDocumentProperties(),需要先创建一个绑定了脚本的模板文档,然后通过复制模板来创建新文档,再触发绑定脚本设置属性。
步骤:
- 创建一个空白Google Doc,打开其脚本编辑器,添加以下代码:
// 绑定到模板文档的脚本,用于设置文档属性 function setDocumentProperty(key, value) { PropertiesService.getDocumentProperties().setProperty(key, value); } // 可选:读取属性的函数 function getDocumentProperty(key) { return PropertiesService.getDocumentProperties().getProperty(key); }
- 保存模板文档,记录其文档ID(
templateDocId)。 - 修改你的Web App中的
createDoc函数,复制模板并调用绑定脚本的函数:
function createDoc(documentName, documentExtId) { var templateDocId = "你的模板文档ID"; // 复制模板文档 var copiedDoc = DriveApp.getFileById(templateDocId).makeCopy(documentName); var docId = copiedDoc.getId(); var docUrl = 'https://docs.google.com/document/d/' + docId + '/edit'; // 使用Apps Script API调用绑定脚本的函数设置属性 var scriptId = "绑定到模板文档的脚本项目ID"; // 可在脚本编辑器「文件」>「项目属性」中查看 UrlFetchApp.fetch(`https://script.googleapis.com/v1/scripts/${scriptId}:run`, { method: "post", contentType: "application/json", headers: { Authorization: `Bearer ${ScriptApp.getOAuthToken()}` }, payload: JSON.stringify({ function: "setDocumentProperty", parameters: ["documentExtId", documentExtId], devMode: true // 开发模式下使用最新代码,上线后可关闭 }) }); return { url: docUrl }; }
注意:此方法需要你的Web App拥有调用Apps Script API的权限,并且需要在Google Cloud Console中启用Apps Script API。
内容的提问来源于stack exchange,提问作者sameer khalid
相关产品推荐
相关产品推荐

