Google Docs Apps Script:如何用AI生成文本替换选中内容?
Google Docs Apps Script选中文本替换问题修复
你的错误根源在于doc.getCursor()返回了null——当用户选中一段文本(而非仅定位光标)时,getCursor()本身就会返回null,且删除选中内容后,原光标位置也会失效。要实现选中内容的完整替换,应该直接操作选区对应的文本元素和范围,而非依赖光标位置。
修正后的完整代码示例
function generateAndReplace() { const doc = DocumentApp.getActiveDocument(); const selection = doc.getSelection(); // 先检查是否存在有效选区 if (!selection) { DocumentApp.getUi().alert('请先选中需要替换的文本'); return; } const rangeElements = selection.getRangeElements(); const rangeElement = rangeElements[0]; const textElement = rangeElement.getElement().asText(); // 获取选中文本的起始和结束偏移量(处理部分选中的情况) const startOffset = rangeElement.getStartOffset(); const endOffset = rangeElement.getEndOffsetInclusive(); // 获取选中的文本作为prompt const prompt = textElement.getText().substring(startOffset, endOffset + 1); // 调用OpenAI API生成新文本(假设completion函数已正确实现) const generatedText = completion(prompt); Logger.log(generatedText); // 替换选中的文本:先删除原内容,再插入新文本 textElement.deleteText(startOffset, endOffset); textElement.insertText(startOffset, generatedText.toString()); } // 假设你的completion函数实现如下(示例) function completion(prompt) { // 这里替换为你实际的OpenAI API调用逻辑 return "AI生成的替换文本"; }
关键修复点
- 增加选区校验:先判断是否存在有效选区,避免无选中时的报错。
- 直接操作文本元素范围:通过
getStartOffset()和getEndOffsetInclusive()获取选中内容的精确位置,直接在原文本元素上删除并插入内容,无需依赖光标。 - 处理部分选中场景:即使只选中了文本的一部分,也能精准替换对应范围的内容。
内容的提问来源于stack exchange,提问作者Luca Mainieri
相关产品推荐
相关产品推荐

