Javascript 在Google工作表中的每个活动单元格中刮取数据后,立即删除Importxml公式

Javascript 在Google工作表中的每个活动单元格中刮取数据后,立即删除Importxml公式,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我使用这个脚本每15分钟从任何网站上抓取一次数据。我想让这个脚本自动删除Importxml公式并只保留值,但仍然无法实现 function fetchData (){ var wrkBk= SpreadsheetApp.getActiveSpreadsheet(); var wrkSht= wrkBk.getSheetByName("Sheet1"); var url= "https://coinmarketcap.com/currencies"

我使用这个脚本每15分钟从任何网站上抓取一次数据。我想让这个脚本自动删除Importxml公式并只保留值,但仍然无法实现

function fetchData (){
  var wrkBk= SpreadsheetApp.getActiveSpreadsheet();
  var wrkSht= wrkBk.getSheetByName("Sheet1");
  var url= "https://coinmarketcap.com/currencies";
  for (var i= 2;i <=6;i++)
  {
  var coin= wrkSht.getRange('A' + i).getValue();
  var formula = "=IMPORTXML(" + String.fromCharCode(34) + url + "/" + coin + String.fromCharCode(34) + "," + String.fromCharCode(34)+"//span[@class='cmc-details-panel-price__price']"+ String.fromCharCode(34)+")";
  wrkSht.getRange('C' + i).activate();
    wrkSht.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
  wrkSht.getRange('C'+i).setFormula(formula);
 
    
    Utilities.sleep(1000);
  
    
}}
第二次尝试

var range = wrkSht.getCurrentCell();
range.copyTo(range, {contentsOnly: true});
这是我的谷歌电子表格


希望有人能帮助我,谢谢你

默认情况下,谷歌应用程序脚本将应用代码所做的更改,直到执行结束。使用
SpreadsheetApp.flush()
强制应用更改,然后再执行“仅作为值复制/粘贴”操作


而不是

var range = wrkSht.getCurrentCell();
使用

您可以使用循环轮询电子表格,直到电子表格重新计算,而不是
sleep

注意:只要有可能,我们就应该避免在循环中使用Google Apps脚本类和方法,因为它们(非常?)慢,而且对于免费帐户(6分钟)执行时间限制很小,而对于G套件帐户(30分钟)执行时间限制不太大。官方文件对此进行了解释,我们对此有几个问题

资源


默认情况下,谷歌应用程序脚本将应用代码所做的更改,直到执行结束。使用
SpreadsheetApp.flush()
强制应用更改,然后再执行“仅作为值复制/粘贴”操作


而不是

var range = wrkSht.getCurrentCell();
使用

您可以使用循环轮询电子表格,直到电子表格重新计算,而不是
sleep

注意:只要有可能,我们就应该避免在循环中使用Google Apps脚本类和方法,因为它们(非常?)慢,而且对于免费帐户(6分钟)执行时间限制很小,而对于G套件帐户(30分钟)执行时间限制不太大。官方文件对此进行了解释,我们对此有几个问题

资源


您能否添加更多关于如何循环而不是
睡眠的信息?不是专门针对这个用例,只是真正感兴趣,因为它在我拥有的其他项目中很有用,而你是这里的MVP之一。@a-burge只要有可能,我们应该避免在循环中使用Google Apps脚本类和方法,因为它们(非常?)对于免费帐户来说,执行速度慢和执行时间限制很小,而对于G套件帐户来说则不是很大。官方文档对此进行了解释(搜索谷歌应用程序脚本最佳实践),我们在这里有几个问题。@a-burge将我之前的评论作为注释添加到了答案中。谢谢鲁本,这是我们的工作。我将从最佳实践链接中了解更多信息。您是否可以添加更多关于如何循环而不是
睡眠的信息?不是专门针对这个用例,只是真正感兴趣,因为它在我拥有的其他项目中很有用,而你是这里的MVP之一。@a-burge只要有可能,我们应该避免在循环中使用Google Apps脚本类和方法,因为它们(非常?)对于免费帐户来说,执行速度慢和执行时间限制很小,而对于G套件帐户来说则不是很大。官方文档对此进行了解释(搜索谷歌应用程序脚本最佳实践),我们在这里有几个问题。@a-burge将我之前的评论作为注释添加到了答案中。谢谢鲁本,这是我们的工作。我将从最佳实践链接中学到更多
SpreadsheetApp.flush(); // This force to apply the previous changes (add the formula)
Utilities.sleep(30000); // This is required to wait for the spreadsheet to be recalculated (importxml import the data)
var range = wrkSht.getDataRange(); // This is in case that you want to paste the whole sheet as values