javascript Google Doc应用脚本使用新文本更新选定文本

oalqel3c  于 2023-04-04  发布在  Java
关注(0)|答案(1)|浏览(152)

我试图写一个应用程序脚本来替换当前的文本选择与一个新的人工智能生成的文本,通过菜单项.该脚本将工作正常,但我不能更新当前的选择,因为我得到以下错误
TypeError:无法在generateAndReplace(Codice:55:19)处读取null的属性(阅读“insertText”)
我猜这是由于选择与光标位置无关...
这是我的剧本

// 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;

}

如何用新文本替换整个选定内容?
谢谢大家!

lztngnrs

lztngnrs1#

我相信你的目标如下。

  • 您想用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);
    });
  }
}

测试:

例如,当const generatedText = completion("someText");generatedText返回sample的文本值时,将获得以下结果。

注:

  • 当未选择文本时,即使运行脚本,脚本也不会运行。当您使用此脚本时,请选择一个文本并运行脚本。
  • 在这个示例脚本中,它假设你的函数completion("someText")工作正常。请小心。

参考文献:

  • 获取选定内容()
  • deleteText(startOffset,endOffsetInclusive)
  • insertText(offset,text)

添加:

从你下面的答复中,
但是我仍然得到一些错误,因为下面的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

相关问题