草庐IT

经验 | Google App Script + Sheet 在表格中用url自动获取页面信息

海泩 2023-10-16 原文

上一篇 Excel + Markdown 为简书文添加表格和批量链接发布后,很开心有几个人用起来了。昨日仙灵更是提出改进版

这一想法很赞,可以进一步提高效率,减少手动复制频率。不过我试了一下,用谷歌在线表格的时候不适用,因为复制到谷歌 sheet 不会自动生成超链接。

并且平日我的习惯是收录文章之后,直接在移动端复制文章链接到表格保存(如下图),后续在用电脑进行审文、校对、排期等操作。

初始状态

但是仙灵给了我灵感(果然是·仙·灵·)。于是,产生一个想法,能不能在表格中写个函数根据文章链接自动获取我需要的其他三个信息呢?也就是作者名字、主页链接以及文章标题。

想要的样子

摸索一番之后,发现无法用表格函数直接实现,需要通过Google App Script写Javascript代码自定义函数才能达成目的。接下来展现操作过程。


第一步、打开 Google App Script

打开谷歌 Sheet 之后,进入AppSheet。

Tool > AppSheet > Create an app

Tool > AppSheet > Create an app

第二步、新建一个 Script

如下图所示,新建一个脚本。随后输入一个名字,复制下方代码就可以了。

新建
命名

第三步、复制粘贴代码

将下方代码(三个函数)复制粘贴在上一步新建的脚本里面,覆盖原有的代码框架即可。

默认新建脚本里的初始代码,可直接删除

下面以从网页获取文章标题的代码为例稍加解释。

function title(input){ // 根据文章url获取文章标题
  var url = UrlFetchApp.fetch(input); //根据input(也就是单元格存储的链接)获取网页内容
  var html = url.getContentText("UTF-8"); //将网页内容存成字符放在html命名的一个地方

  var searchstring = '_1RuRku">'; //在网页内容中搜索引号内的字符串
  var index = html.search(searchstring); //字符串中第一个字符的索引(=门牌号)
  var pos = index + searchstring.length; //index加上字符串长度得到字符串后面第一个字母的索引
  var rate = html.substring(pos, pos+40); //从pos这个位置开始,取40个字符长的一部分
  var title = rate.split("<")[0]; //从取出来的rate里面截取<符号前面的内容就是文章的标题了
  return title; //把标题内容显示在单元格里面
}

上面这一部分代码其实就是在让电脑根据网页的链接,找到网页内容,从中找出来我需要的文章标题。需要注意的是其中用到的搜索参考节点_1RuRku"><。我是怎么知道这两个东西中间就是文章标题的呢?这需要先打开一篇简书文章的网址,查看源代码,对照确认。

如下图所示,查看红剪头指向的方框内部会发现文章标题左右的内容,这就是我用来搜索的参考坐标。

网页源代码对照

下面给出获取作者名字及作者主页链接的代码。在返回作者主页链接时稍有不同,因为需要自己把网址补全。这里不展开来说。

function author(input){ // 根据文章url获取作者名字
  var url = UrlFetchApp.fetch(input);
  var html = url.getContentText("UTF-8");

  var searchstring = '_22gUMi">';
  var index = html.search(searchstring);
  var pos = index + searchstring.length;
  var rate = html.substring(pos, pos+40);
  var author = rate.split('<')[0];
  return author;
}

function author_url(input){ // 根据文章url获取作者个人主页链接
  var url = UrlFetchApp.fetch(input);
  var html = url.getContentText("UTF-8");

  var searchstring = 'qzhJKO" href="';
  var index = html.search(searchstring);
  var pos = index + searchstring.length;
  var rate = html.substring(pos, pos+40);
  var author_url = rate.split('"')[0];
  return "https://www.jianshu.com/"+author_url;
}

第四步、保存代码,返回原表格使用自定义函数

将上述三段代码保存之后,返回之前打开的Google Sheet。假如文章链接本来存放在D2单元格,在需要生成文章标题的位置输入=title(D2),回车之后就会看到文章标题自己出来了。类似的,用=author(D2)=author_url(D2)生成作者名字和作者主页链接。这是因为代码里面是这么给函数命名的。

生成文章标题

完美收工

至此就实现了懒人高效生成表格内容,再衔接 Excel + Markdown 为简书文添加表格和批量链接一起使用,又省了好多分钟呢[笑哭]。

你永远无法想象一个人为了偷懒几分钟花几十分钟去使劲扒拉的样子

另外,可惜腾讯在线表格貌似不支持自定义函数功能。

有关经验 | Google App Script + Sheet 在表格中用url自动获取页面信息的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  5. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  6. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  7. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  8. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  9. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  10. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

随机推荐