Google Spreadsheets:用于检查ImportHTML完成情况的脚本

时间:2014-06-20 17:39:44

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

我想自动一天抓取一个网站的数据。在Google Spreadsheets中,我使用=ImportHTML()函数导入数据表,然后使用=query()提取相关数据。每次打开电子表格时,这些功能都需要10到30秒才能完成计算。

我使用预定的Google Apps脚本,每天将数据复制到不同的工作表(存储位置,以便我可以运行统计信息)。

我的问题是,在复制数据之前,我无法让脚本等待计算完成。结果是我的脚本只复制错误消息“N / A”。

我尝试添加Utilities.sleep(60000);,但它无效。

是否可以创建一个循环,检查计算完成?我试了这个没有成功:

function checkForError() {
  var spreadsheet = SpreadsheetApp.getActive();
  var source = spreadsheet.getRange ("Today!A1");
  if (source = "N/A") {
    Utilities.sleep(6000);
    checkForError();
  } else {
    moveValuesOnly();
  }
}

2 个答案:

答案 0 :(得分:1)

锁就是为了这个。在文档中查找锁定服务。使用公共锁。

答案 1 :(得分:0)

以下是我如何使用Zig的建议(结合我自己的检查循环)来解决我的类似问题:

   // Get lock for public shared resourse 
  var lock = LockService.getPublicLock();
   // Wait for up to 120 seconds for other processes to finish.
   lock.waitLock(120000);
   // Load my values below
   //   something like sheet.getRange("A1").setFormula('=  etc...  
   // Now force script to wait until cell D55 set to false (0) before 
   // performing copy / pastes
  var current = SpreadsheetApp.setActiveSheet(sheet.getSheets()[1]);
  var ready = 1;
  var count = 0;
       while (true) {
        // break out of function if D55 value has changed to zero or counter
        // has hit 250
         if (count >= 250) break;

        // otherwise keep counting...
     ready = current.getRange("D55").getValue();
         if (ready == 0) {count = 400;}
            Utilities.sleep(100);
                   ++count;
      }
  // wait for spreadsheet to finish... sigh...
  Utilities.sleep(200);
  // Do my copy and pastes stuff here
  // for example sheet.getRange("a1:b1").copyTo(sheet.getRange("a3"), {contentsOnly:true});
  // Key cells are updated so release the lock so that other processes can continue.
   lock.releaseLock();
  // end script
   return;
}

这对我来说非常棒,阻止了Google的零星服务破坏了我的工作! 谢谢Zig的建议!