javascript 获取选定的文本,将其发送到Scryfall API,然后获取链接并将其放入选定的文本中

vq8itlhq  于 2022-12-10  发布在  Java
关注(0)|答案(1)|浏览(125)

我已经能够整理出中间位(API似乎被调用得很好)沿着子菜单的显示。最初我认为只是结束部分不起作用,但我现在认为选择部分也不起作用。
getSelection()我做错了什么,我需要做什么来插入链接到所说的选择?(澄清,不是用链接替换文本,而是插入链接到文本)

//Open trigger to get menu
function onOpen(e) {
 DocumentApp.getUi().createAddonMenu()
  .addItem('Scry', 'serumVisions')
  .addToUi();
}

//Installation trigger
function onInstall(e) {
 onOpen(e);
}

//I'm not sure if I need to do this but in case; declare var elements first

var elements

// Get selected text (not working)
function getSelectedText() {
const selection = DocumentApp.getActiveDocument().getSelection();
 if (selection) {
  var elements = selection.getRangeElements();
  Logger.log(elements);
 } else {
  var elements = "Lack of selection"
  Logger.log("Lack of selection");
 }
}

//Test run
// insert here

// Search Function
function searchFunction(nameTag) {
 // API call + inserted Value
 let URL = "https://api.scryfall.com/cards/named?exact=" + nameTag;
 // Grabbing response
 let response = UrlFetchApp.fetch(URL, {muteHttpExceptions: true});
 let json = response.getContentText();
 // Translation
 let data = JSON.parse(json);
 // Jackpot
 let link = data.scryfall_uri;
 // Output
 Logger.log(link);
}

// Test run
searchFunction("Lightning Bolt");

//Let's hope this works how I think it works
function serumVisions() {
 const hostText = getSelectedText();
 const linkage = searchFunction(hostText);
 // Unsure what class I'm supposed to use, this doesn't
 const insertLink = DocumentApp.getActiveDocument().getSelection().newRichTextValue()
 .setLinkUrl(linkage);
 Logger.log(linkage);
}

对于第一部分,我尝试了Google文档中的getSelection()getCursor()示例,但它们似乎不起作用,它们都一直返回null。
对于插入链接位,我从文档的电子表格部分阅读了所有这些类,当时我不知道,但现在知道,我还没有能够找到一个版本的谷歌文档的相同任务。也许它的工作,但我写错了,以及,idk。

5n0oy7gb

5n0oy7gb1#

修改点:

  • 在您的脚本中,getSelectedText()searchFunction(nameTag)的函数没有返回值。我认为这可能是您当前they all just keep returning null.问题的原因。
  • var elements = selection.getRangeElements();elements不是文本数据。
  • DocumentApp.getActiveDocument().getSelection()没有newRichTextValue()的方法。
  • searchFunction("Lightning Bolt");的情况下,当脚本运行时,该函数始终运行。请注意这一点。

当这些要点反映在你的脚本中时,下面的修改怎么样?

修改的脚本:

请删除searchFunction("Lightning Bolt");。并且,在这种情况下,不使用var elements。请注意这一点。
从您的脚本中,我猜测在您的情况下,您可能希望运行serumVisions()。而且,我还认为您可能希望运行单个函数。因此,我对您的脚本进行了如下修改。

function getSelectedText() {
  const selection = DocumentApp.getActiveDocument().getSelection();
  var text = "";
  if (selection) {
    text = selection.getRangeElements()[0].getElement().asText().getText().trim();
    Logger.log(text);
  } else {
    text = "Lack of selection"
    Logger.log("Lack of selection");
  }
  return text;
}

function searchFunction(nameTag) {
  let URL = "https://api.scryfall.com/cards/named?exact=" + encodeURIComponent(nameTag);
  let response = UrlFetchApp.fetch(URL, { muteHttpExceptions: true });
  let json = response.getContentText();
  let data = JSON.parse(json);
  let link = data.scryfall_uri;
  Logger.log(link);
  return link;
}

// Please run this function.
function serumVisions() {
  const hostText = getSelectedText();
  const linkage = searchFunction(hostText);
  if (linkage) {
    Logger.log(linkage);
    DocumentApp.getActiveDocument().getSelection().getRangeElements()[0].getElement().asText().editAsText().setLinkUrl(linkage);
  }
}
  • 当您在Google文档中选择“Lightning Bolt”的文本并运行serumVisions()函数时,将检索到Lightning Bolt的文本,并检索到类似https://scryfall.com/card/2x2/117/lightning-bolt?utm_source=api的URL。并且,此链接将设置为所选文本“Lightning Bolt”。

参考:

  • 获取选择()

相关问题