【问题标题】:Trigger importHTML in Google Apps Script在 Google Apps 脚本中触发 importHTML
【发布时间】:2017-02-11 02:21:09
【问题描述】:

我想知道是否可以编写一个 Google Apps 脚本来触发 Google 电子表格中的每日 importhtml。例如,假设我想每天下午 1 点导入下表的更新。

=IMPORTHTML("https://en.wikipedia.org/wiki/Lubbock,_Texas","table",5)

即使我的计算机处于离线状态,我也需要自动检查表更新。 谢谢

【问题讨论】:

  • 当您说导入更新时?您的意思是每天下午 1 点复制表格还是查找对前几天表格的更改并仅存储更改?应用脚本在谷歌服务器上运行,因此即使您的计算机处于离线/关闭状态,它们也能正常工作。
  • 我的意思是导入新表,即使没有更改。但我敢肯定每天都会有新的表格数据

标签: google-apps-script google-sheets google-sheets-formula


【解决方案1】:

是的,可以编写一个脚本来每天制作一份表格的副本。 简而言之,您必须复制导入的表格并将其粘贴到新工作表中。每次打开/访问电子表格时,ImportHTML a 都会更新。因此,存储表格的唯一方法是复制并将其粘贴到新工作表中。

下面的代码就是这样做的:

function getImportData()
{
 var ss = SpreadsheetApp.getActive()
var sheet =ss.getSheetByName("ImportSheet")

if (sheet == null)
{  
sheet = ss.insertSheet("ImportSheet")
sheet.getRange(1,1).setValue( "=IMPORTHTML(\"https://en.wikipedia.org/wiki/Lubbock,_Texas\",\"table\",5)")
}
var dataRange = sheet.getDataRange()
//waitforLoading waits for the function importHTML to finish loading the table, only a problem if table takes a while to load
//for more discussion on this visit : http://stackoverflow.com/questions/12711072/how-to-pause-app-scripts-until-spreadsheet-finishes-calculation
var wait = waitForLoading(dataRange,sheet, 10)
var logSheet = ss.getSheetByName("ImportLogSheet")
 if (logSheet == null)
  {  
    logSheet = ss.insertSheet("ImportLogSheet")
  }
  var timeStampRow = []
  timeStampRow[0] = new Date()
if(wait)
{
  logSheet.appendRow(timeStampRow)
  var lastRow = logSheet.getLastRow() + 1
  var destinationRange = logSheet.getRange(lastRow,1)
  dataRange.copyTo(destinationRange, {contentsOnly:true})  

}
  else {
    timeStampRow[1] = "Scripted timeout waiting for the table to Load " 
    logSheet.appendRow(timeStampRow)
  }
}

function waitForLoading(dataRange, sheet, maxWaitTimeInSec)
{
 // This function is only required if it takes a while for the importHTML to load your data!
 // if not you can skip this function

  // Function looks to see if the value of the  
for(i = 0; i< maxWaitTimeInSec ; i++)
{
  var value = dataRange.getCell(1,1).getValue()
  if(value.search("Loading") !== -1) {
    Utilities.sleep(1000);
    dataRange = sheet.getDataRange()
  } else {
   return true
  }

}
  return false

}

编辑:忘了提及设置触发器。您可以使用时间驱动的触发器设置要触发的任何功能。此处提供了有关如何设置的详细信息:https://developers.google.com/apps-script/guides/triggers/installable#managing_triggers_manually

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多