Извлечь URL-адрес из тела html для определенного текста ссылки в надстройке Gmail

Я пытаюсь получить href из HTML-документа (электронная почта Gmail), в котором есть текст ссылки «кошки».

Например, Я хочу извлечь URL-адреса из приведенных ниже ссылок, которые будут где угодно в html-документе.

<a href = "https://www.google.com/search?q=cats&oq=cats" target = "_blank">cats</a>
or 
<a href = "https://www.google.com/search?q=cats&oq=cats" target = "_blank">yay cats</a>

Примечание. Я создаю надстройку для Gmail.

@Cooper извините за поздний ответ. Вчера отсутствовал у моего компьютера, но я просмотрел множество других вариантов (здесь перечислены два: stackoverflow.com/questions/18727341/… | Bettercloud.com/monitor/the-academy/…). Все они предоставляют способы извлечения href, но не способы получения информации о конкретной ссылке.

credizian 01.03.2019 15:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
1
1 008
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поиск ссылок и других материалов в электронном письме с помощью регулярных выражений Gmail Addon

Это тестер регулярных выражений, поэтому он, вероятно, больше, чем вы ожидали, но он найдет ссылки, которые вы ищете, а также любые другие, которые вы хотите найти. Это будет работать для ваших текущих потребностей: <.*q=cats.*>. В настоящее время используется функция регулярных выражений String.match, вы можете найти ее объяснение здесь Внизу страницы есть URL-адрес, который должен указывать на электронную таблицу, содержащую страницу с именем «По умолчанию», как объяснено позже.

function buildAddOn(e) {
  var accessToken = e.messageMetadata.accessToken;
  GmailApp.setCurrentMessageAccessToken(accessToken);
  var msg=GmailApp.getMessageById(e.messageMetadata.messageId).getPlainBody();
  setDefaults({message:msg});
  var cards = [];
  cards.push(buildRegexTester(getDefaults()));
  return cards;
}

function buildRegexTester(dfltObj){
  var card=CardService.newCardBuilder();
  card.setHeader(CardService.newCardHeader().setTitle('Regex Tester'));
  var section=CardService.newCardSection().setHeader('Email Body Search');
  var plainBodyText=CardService.newTextParagraph().setText(dfltObj.message);
  section.addWidget(plainBodyText)
  var saveRegexButton=CardService.newTextButton().setText('Save Regex').setOnClickAction(CardService.newAction().setFunctionName('saveRegex'));
  section.addWidget(saveRegexButton);
  var regexTextBox=CardService.newTextInput()
  .setFieldName('Regex')
  .setTitle('Regex')
  .setMultiline(true)
  .setValue(dfltObj.Regex);
  section.addWidget(regexTextBox);
  var searchButton=CardService.newTextButton().setText('Search').setOnClickAction(CardService.newAction().setFunctionName('search')); 
  section.addWidget(searchButton);
  var regexResultBox=CardService.newTextInput()
  .setFieldName('Results')
  .setTitle('Results')
  .setMultiline(true)
  .setValue(dfltObj.results);
  section.addWidget(regexResultBox);
  var clearResultsButton=CardService.newTextButton().setText('Clear Results').setOnClickAction(CardService.newAction().setFunctionName('clearResults'));
  section.addWidget(clearResultsButton)
  var g_toggle=CardService.newKeyValue()
  .setContent('global search')
  .setSwitch(CardService.newSwitch()
            .setSelected(dfltObj.g)
            .setFieldName('g')
            .setValue('g')
            .setOnChangeAction(CardService.newAction().setFunctionName('saveFlags')));
  section.addWidget(g_toggle);
  var i_toggle=CardService.newKeyValue()
  .setContent('ignore case')
  .setSwitch(CardService.newSwitch()
            .setSelected(dfltObj.i)
            .setFieldName('i')
            .setValue('i')
            .setOnChangeAction(CardService.newAction().setFunctionName('saveFlags')));
  section.addWidget(i_toggle);
  var m_toggle=CardService.newKeyValue()
  .setContent('multiline search')
  .setSwitch(CardService.newSwitch()
            .setSelected(dfltObj.m)
            .setFieldName('m')
            .setValue('m')
            .setOnChangeAction(CardService.newAction().setFunctionName('saveFlags')));
  section.addWidget(m_toggle);
  card.addSection(section);
  return card.build();
}

function getDefaults(){
  var ss=SpreadsheetApp.openByUrl(RegexTesterAddon_URL);
  var sh=ss.getSheetByName('Defaults');
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var dfltObj = {};
  for(var i=0;i<vA.length;i++){
    dfltObj[vA[i][0]]=vA[i][1];
  }
  return dfltObj;
}

function setDefaults(dfltObj){
  var ss=SpreadsheetApp.openByUrl(RegexTesterAddon_URL);
  var sh=ss.getSheetByName('Defaults');
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  for(var i=0;i<vA.length;i++){
    if (typeof(dfltObj[vA[i][0]])!='undefined'){
      vA[i][1]=dfltObj[vA[i][0]];
    } 
  }
  rg.setValues(vA);
}

function saveFlags(e){
  Logger.log('\nsaveFlags():\n%s\n',e);
  var g=(typeof(e.formInput.g)!='undefined')?true:false;
  var i=(typeof(e.formInput.i)!='undefined')?true:false;
  var m=(typeof(e.formInput.m)!='undefined')?true:false;
  var flagObj = {g:g,i:i,m:m};
  setDefaults(flagObj);
}

function saveRegex(e){
  Logger.log('\nsaveRegex():\n%s',e);
  var regex=(typeof(e.formInput.Regex)!='undefined')?e.formInput.Regex:'';
  if (regex){
    var rObj = {Regex:regex};
    setDefaults(rObj);
  }
}

function saveResults(rsltObj){
  setDefaults(rsltObj);
}

function getFlags(){
  var dfltObj=getDefaults();
  var flagsA=[];
  if (dfltObj.g){flagsA.push('g');}
  if (dfltObj.i){flagsA.push('i');}
  if (dfltObj.m){flagsA.push('m');}
  var flags=flagsA.join('');
  return flags;  
}

function search(e){
  Logger.log('\nSearch():\n%s',e);
  if (typeof(e.formInput.Regex)!='undefined'){
    saveFlags(e);
    saveRegex(e);
    var dfltObj=getDefaults();
    var flags=getFlags();
    var pattern=dfltObj.Regex;
    Logger.log('\nflags: %s\npattern: %s',flags,pattern);
    var re=new RegExp(pattern,flags);
    //var result=re.exec(dfltObj.message);
    var result=dfltObj.message.match(re);
    if (result) {
      Logger.log('\nresult: %s\nmessage:',result,dfltObj.message);
      if (result){
        var rsltLog='';
        for(var i=0;i<result.length;i++){
          if (i>0){rsltLog+='\n'};
          rsltLog+='result[' + i + ']= ' + result[i];
        }
      }
      console.info('module: %s pattern: %s regex: %s flags: %s result: %s length: %s',"findData()",pattern,re,flags,rsltLog,result.length);
    }
    if (result){
      var results=rsltLog;
    }else{
      var results = "No Results";
    }
    //var rsltObj = {results:results};
    var rsltObj = {results:escapeHtml(results)};
    saveResults(rsltObj);
    return buildRegexTester(getDefaults());
  }
}

function clearResults(e){
  var dfltObj=getDefaults();
  dfltObj.results='';
  return buildRegexTester(dfltObj);
}

//Came From: @Kip https://stackoverflow.com/a/4835406/7215091
function escapeHtml(text) {
  var map = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#039;'
  };

  return text.replace(/[&<>"']/g, function(m) { return map[m]; });
}

var RegexTesterAddon_URL='link to a spreadsheet that contain defaults';

В электронной таблице должна быть страница с именем «По умолчанию», и она выглядит следующим образом:

На странице используются только столбцы A и B, и она должна иметь сообщение, регулярное выражение, g, i, m и результаты, как показано на рисунке. Типичная настройка для g,i,m — TRUE, FALSE, FALSE, которая поможет вам начать работу. Это регулярное выражение работает для ваших текущих требований <.*q=cats.*>

Я не буду контролировать HTML. Это надстройка Gmail, поэтому она будет работать на любой электронной почте.

credizian 01.03.2019 15:30

Извините, я только пометил этим вопрос... Я обновлю текст вопроса этим.

credizian 01.03.2019 17:45

Надеюсь, это решение поможет найти нужную ссылку, а также многие другие.

Cooper 01.03.2019 22:24

Ох... мне многое предстоит переварить. Пожалуйста, дайте мне немного времени, чтобы рассмотреть и попробовать. Кстати, не могли бы вы отменить голосование против?

credizian 01.03.2019 22:58

:) Справедливо. Надеюсь, я смогу заработать его обратно!

credizian 01.03.2019 23:11

Итак, я попытался понять ваш код... не думаю, что я полностью понял, но понял суть, а затем меня осенило, что я недооцениваю регулярные выражения. Затем я попытался создать простое регулярное выражение (regexr.com/49eeh) и выполнить его в своем дополнении, но оно возвращает null, когда не должно. Код в скрипте приложения-> "var regex = /(href=(.*))+(>helloworld</a>)/gi;"

credizian 02.03.2019 20:38

Я думал, ты ищешь кошек. Регулярные выражения легко недооценить.

Cooper 02.03.2019 20:50

Большая часть карты представляет собой базовый материал CardService для надстроек Gmail. Я предположил, что вы это уже знали. А остальные сценарии приложений в основном просто сохраняют и извлекают значения по умолчанию из электронной таблицы.

Cooper 02.03.2019 20:55

Другие вопросы по теме