Google apps script 满足条件时粘贴值的时间触发脚本(不存在#N/A)
这是一个想法:我想自动从一个单元格输入数据,该单元格不断变化到另一个工作表中的某个范围,因此脚本根据定时触发器在特定时间触发,复制变化单元格的值,并用变化单元格的值填充另一个工作表中的列。我应该提到我使用定时触发器的原因是因为我不想让电子表格在计算机上一直打开,而是让它在我不打开的情况下自动发生 问题出在这里:由于更改的单元格基于Google/Yahoo财务数据,因此打开电子表格后加载可能需要时间。通常,在下载数据之前,单元格将读取“加载”数秒钟。在此期间,我希望复制和粘贴的单元格显示为“正在加载”或“不适用”。因此,这些是复制并粘贴到我的记录数据表中的“值”。有时数据根本不会被下载,直到我重新加载电子表格,单元格才会显示“#N/A” 这是我迄今为止的进展:到目前为止,我的脚本基本上是功能性的,如果将定时触发器设置为短时间(5分钟),结果是完美的,所有数据都被正确记录,但是我正在查看每天运行一到两次的脚本,当我将时间增加到小时时,一些数据显示为“#N/a”或“加载”。有时重新加载电子表格可以解决这个问题 我得到的印象是,Google Sheets不会将数据缓存超过几分钟,因此当触发器之间的时间较短时,数据仍然可用,并且一切正常,但当时间增加(例如,增加到1小时)时,一切都会重新下载,导致“加载” 下面是我用来将值从一张图纸复制/粘贴到另一张图纸的代码脚本:Google apps script 满足条件时粘贴值的时间触发脚本(不存在#N/A),google-apps-script,triggers,automation,google-sheets,conditional,Google Apps Script,Triggers,Automation,Google Sheets,Conditional,这是一个想法:我想自动从一个单元格输入数据,该单元格不断变化到另一个工作表中的某个范围,因此脚本根据定时触发器在特定时间触发,复制变化单元格的值,并用变化单元格的值填充另一个工作表中的列。我应该提到我使用定时触发器的原因是因为我不想让电子表格在计算机上一直打开,而是让它在我不打开的情况下自动发生 问题出在这里:由于更改的单元格基于Google/Yahoo财务数据,因此打开电子表格后加载可能需要时间。通常,在下载数据之前,单元格将读取“加载”数秒钟。在此期间,我希望复制和粘贴的单元格显示为“正在加
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/As,则将值复制/粘贴到记录的 数据表
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
}
功能刷新表(电子表格,工作表){
var dataArrayRange=sheet.getRange(1,1,sheet.getLastRow(),sheet.getLastColumn());
var dataArray=dataArrayRange.getValues();//刷新自定义函数所必需的
var=true;
while(nanFound){
对于(var i=0;i=0{
nanFound=true;
dataArray=dataArrayRange.getValues();
打破
}//如果结束,则结束
如果(i==dataArray.length-1)nanFound=false,则为else;
}//结束
}//结束时
}
我没有得到什么吗?是否有更简单的方法,或者这是不可能的?我想知道的是,您提到刷新电子表格只解决了“部分”时间。问题可能是刷新工作表并不能解决加载错误,并且工作表会继续刷新。您是否考虑过使用一个定时触发器刷新sheeT,还有一个第二个定时触发器,稍后运行一段时间来处理它?它可能会给它足够的时间来加载。@ @ HeCalbRUS感谢回复!是的,我确实通过使用“时钟触发器”来考虑这一点,并为两者设置了一个特定的时间。然而,从我在谷歌应用脚本网站上看到的()时间触发器的执行时间为+-15分钟,与您输入的值无关,每隔15分钟,我已经看到一些N/Aappearing@HDCerberus所以我试着创建两个脚本,在不同的时间执行,让它在一天中运行,不幸的是,丢失的数据确实被记录下来,这证实了我担心会发生的事情我想知道我的刷新脚本是否不正确,但我不确定如何测试它。