Google Doc App 脚本用新文本更新选定的文本

问题描述 投票:0回答:1

我正在尝试编写一个应用程序脚本,通过菜单项用新的 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;

} 

如何用新文本替换整个选择?

谢谢!

javascript google-apps-script google-docs
1个回答
0
投票

我相信你的目标如下。

  • 您想用
    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
    .
© www.soinside.com 2019 - 2024. All rights reserved.