我正在尝试编写一个应用程序脚本,通过菜单项用新的 AI 生成的文本替换当前的文本选择。 该脚本可以正常工作,但我无法更新当前选择,因为出现以下错误
TypeError:无法读取 null 的属性(读取“insertText”) 在 generateAndReplace(Codice:55:19)
我猜这是因为选择与光标位置无关...
这是我的剧本
// Get the active Google Docs document and the user-selected text
const doc = DocumentApp.getActiveDocument();
const userText = doc.getSelection().getRangeElements()[0].getElement().asText().getText();
// Get the body of the document and the prompt for the OpenAI API request
const body = doc.getBody();
const prompt = doc.getSelection().getRangeElements()[0].getElement().asText().getText();
// Get the completion prompt from OpenAI API request
generatedText = completion(prompt)
// log
Logger.log(generatedText);
var currentPosition = doc.getCursor();
deleteSelectedText();
currentPosition.insertText(generatedText.toString());
return;
}
如何用新文本替换整个选择?
谢谢!
我相信你的目标如下。
generatedText = completion(prompt)
替换所选文本。completion(prompt)
。但是,你的功能completion(prompt)
工作正常。var currentPosition = doc.getCursor()
和currentPosition.insertText(generatedText.toString())
的情况下,无法使用所选文本。我想你这期TypeError: Cannot read properties of null (reading 'insertText')
的原因就是因为这个getSelection()
.当这些点都体现在脚本中时,下面的示例脚本怎么样?
当您使用此脚本时,请选择一个文本并运行脚本。
function myFunction() {
const selection = DocumentApp.getActiveDocument().getSelection();
if (selection) {
selection.getRangeElements().forEach(e => {
const start = e.getStartOffset();
const end = e.getEndOffsetInclusive();
const prompt = e.getElement().asText();
const generatedText = completion(prompt.getText()); // This is your function.
prompt.deleteText(start, end);
prompt.insertText(start, generatedText);
});
}
}
例如
generatedText
的const generatedText = completion("someText");
返回sample
的文本值时,得到如下结果
没有选中文本时,即使运行脚本,脚本也不运行。当您使用此脚本时,请选择一个文本并运行脚本。
在此示例脚本中,它假设您的函数
completion("someText")
工作正常。请注意这一点。
从您的以下回复中,
但我仍然遇到一些错误,因为以下 const start = e.getStartOffset(); const end = e.getEndOffsetInclusive();将返回 start=-1 和 end=-1
我担心您选择的文本包含图像。从您
replace the current text selection with a new AI generated text
的问题来看,我认为您想替换所选文本。如果您选择的文本包含图像,下面的示例脚本怎么样?
function myFunction() {
const selection = DocumentApp.getActiveDocument().getSelection();
if (selection) {
selection.getRangeElements().forEach(e => {
const start = e.getStartOffset();
const end = e.getEndOffsetInclusive();
if (start == -1 && end == -1) {
e.getElement().removeFromParent();
return;
}
const prompt = e.getElement().asText();
const generatedText = completion(prompt.getText()); // This is your function.
prompt.deleteText(start, end);
prompt.insertText(start, generatedText);
});
}
}
generatedText
.