如果满足条件,则时间触发脚本粘贴值(缺少#N / A)

时间:2014-12-19 11:16:10

标签: google-apps-script triggers automation google-sheets conditional

以下是的想法:我希望自动将数据输入从一个不断变化的单元格转移到另一个工作表中的范围,因此脚本会根据定时触发器在特定时间触发,复制更改单元格的值,并使用更改单元格的值填充另一个工作表中的列。我应该提一下我使用定时触发器的原因是因为我不想在电脑上随时打开电子表格,而是让它自动发生而不打开它。

问题:由于更改的单元格基于Google / Yahoo财经数据,因此在打开电子表格后加载可能需要一些时间。通常,细胞将读取"装载"几秒钟,直到下载数据。在此期间,我希望复制和粘贴的单元格读取" Loading"或" #N / A"。结果这些是"值"复制并粘贴到我的记录数据表中。有时数据根本没有下载,并且单元格会读取" #N / A"直到我重新加载电子表格。

这是我目前的进展:到目前为止,我的脚本大部分功能正常,如果定时触发设置为短时间(5分钟),结果是完美的,所有数据记录是正确的,但我每天运行一到两次这个脚本,当我把时间增加到几个小时时,一些数据显示为"#N / A"或"正在加载"。有时重新加载电子表格解决了这个问题。

我认为Google表格不会将数据缓存超过几分钟,所以当触发时间很短时,数据仍然可用且一切正常,但是当时间增加时(例如1小时)重新下载所有内容,导致"加载"。

以下是我用于将值从一个工作表复制/粘贴到另一个工作表的代码脚本:

function PasteValue() {
var ss = SpreadsheetApp.openById("my spreadsheet ID");
var nextRow = ss.getSheetByName('My recorded data sheet').getLastRow()+1;
ss.getRange("Changing Data Sheet!F6").copyTo(ss.getRange("My recorded data sheet!A" + nextRow),{contentsOnly:true});
}

我的想法:我想到的解决方案是在" PasteValue()"之前有第二个功能。一个会重新加载电子表格直到没有" #N / A"可以在"更改数据表"中找到。这也可以通过定时触发来完成:

  • 以固定间隔打开电子表格
  • 搜索数据表" #N / A"
  • 如果找到一个#N / A,则重新加载电子表格,直到没有 结果
  • 如果找不到#N / As,则在记录中复制/粘贴这些值 数据表

我找到了一个重新加载电子表格的脚本,直到找不到#N / As为止,但是当我将我的脚本和下面的脚本组合在一起时,我的记录数据表上仍然会丢失数据。

我在Stack Overflow上找到refresh script

function refreshSheet(spreadsheet, sheet) {
var dataArrayRange = sheet.getRange(1,1,sheet.getLastRow(),sheet.getLastColumn());
var dataArray = dataArrayRange.getValues(); // necessary to refresh custom functions
var nanFound = true;
while(nanFound) {
for(var i = 0; i < dataArray.length; i++) {
  if(dataArray[i].indexOf('#N/A') >= 0) {
    nanFound = true;
    dataArray = dataArrayRange.getValues();
    break;
  } // end if
  else if(i == dataArray.length - 1) nanFound = false;
 } // end for
} // end while
}

我没有得到什么吗? 是否有更简单的方法,或者这是不可能的?

0 个答案:

没有答案