Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何根据列中的日期在google工作表中获取数据数组?_Javascript_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript 如何根据列中的日期在google工作表中获取数据数组?

Javascript 如何根据列中的日期在google工作表中获取数据数组?,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我每天都试图从谷歌的一张工作表到另一张工作表中提取数据的子部分。拉是有条件的日期,这就是为什么我挣扎 背景-我有“工作簿1”,记录不同NBA球队每天的价格数据。每天捕获数据并将其添加到表的底部(因此最新的价格数据位于底部)。在K列上加盖日期戳,日期为=今天()。。标题是“提取日期” 我有一个单独的工作手册,我们称之为NBA的“工作手册2”,其中我希望包括工作手册1中相同的价格数据,但仅在随后的15天内(以使其更加灵活)。为了实现这一点,我希望脚本每天早上将昨天的值从“工作簿1”增量添加到“工作簿

我每天都试图从谷歌的一张工作表到另一张工作表中提取数据的子部分。拉是有条件的日期,这就是为什么我挣扎

背景-我有“工作簿1”,记录不同NBA球队每天的价格数据。每天捕获数据并将其添加到表的底部(因此最新的价格数据位于底部)。在K列上加盖日期戳,日期为=今天()。。标题是“提取日期”

我有一个单独的工作手册,我们称之为NBA的“工作手册2”,其中我希望包括工作手册1中相同的价格数据,但仅在随后的15天内(以使其更加灵活)。为了实现这一点,我希望脚本每天早上将昨天的值从“工作簿1”增量添加到“工作簿2”(目前我将手动删除任何超过15天的行)

目的-我已经在工作簿2中的表上构建了一个报告,带有两周的跟踪分析,因为工作簿1文件太大(可以追溯到几个月前)

问题-我有一些不相关工作簿中的旧代码,我将数据从一张工作表拉到另一张工作表,但它不是基于拉日期的条件。对于此脚本,我希望我的“工作簿2”工作簿从“工作簿1”请求数据,并将其添加到“工作簿2”的工作表1底部,但仅适用于包含昨天日期的行(或=今天()-1)。包含昨天日期的行的数量是动态的,并且随着时间的推移而不断减少,因此我今天要移动的行的数量与我上周移动的行的数量不同

我的数组有15列宽,但行数每天都会改变。以下是我的出发点:

function runOne() { 
  var ss=SpreadsheetApp.openById('Workbook 1 sheet id');
  var tsh=ss.getSheetByName('sheet 1');
  ???
我不知道如何有条件地提取昨天的数据并使行计数动态。在获得正确的值后,我需要将其粘贴到“工作簿2”中标题为“工作表1”的选项卡底部

我很少有脚本编写的经验,因此非常感谢您的帮助。我试图尽可能多地澄清上述内容,但如果需要进一步澄清,请告诉我。

  • 您的日期戳在第11(K)栏中
  • 您希望每天自动运行脚本(按时触发)
  • 您想向工作簿中添加工作簿1第1页中时间戳为昨天的2个第1页条目
这就是如何实现它的方法
  • 编写一个代码,计算从昨天开始的日期,并将其与K列中的时间戳进行比较
  • 将函数绑定到,根据需要选择一天中要运行的时间

您可以共享一个指向示例电子表格的链接吗?当然可以。这是一个小得多的示例(只有156行而不是18000行),但概念和格式是相同的。我已经按提取日期分类了。这是工作簿1(主数据工作簿),但工作簿1和工作簿2的格式相同。工作簿2将调用工作簿1中的数据。您看到Sheets
query
函数了吗?您可以在第一个工作簿的另一个工作表上使用它来筛选源数据。共享您的电子表格样本。@cooper我在上面的评论中共享了。点击链接。(忘了给你贴标签了)。你好@ziganotschka谢谢你的评论,很抱歉,几天后我才有机会运行它。。第4行出现语法错误。知道为什么吗?Hi@ziganotschka我调整了脚本以修复错误,但出于某种原因,它从12/7开始拉行,而不是昨天*更新了脚本第4行和第5行:
var ss2=SpreadsheetApp.openById(“工作簿2电子表格id”);var tsh2=ss2.getSheetByName('sheet 1')我假设语法错误是因为您没有正确地将“工作簿2电子表格id”替换为第二个工作簿的真实id。如果“工作表1”不是工作簿2中您感兴趣的工作表的名称,请相应地替换该名称。注意区分大小写!例如,“工作表1”与“工作表1”不同,而“工作表1”与“工作表1”不同。嗨@ziganotschka-我今天早上再次运行了它,它工作正常。非常感谢你的帮助,我的朋友,你是个救命恩人!我已将你的评论标记为答案。最后一个问题@ziganotschka。代码在我的示例工作簿中起作用,但当我将其转移到实际工作簿时,它会以不同的格式粘贴日期字段。它获取了正确的数据(昨天),但粘贴后的日期显示为“1/4/2020 23:00:00”。有没有办法解决这个问题?我试图重新格式化整个专栏,但没有成功。同样,它获取了正确的数据(原始工作簿中为2020年1月5日),但粘贴为2020年1月4日23:00:00。
function runOne() { 
  var ss=SpreadsheetApp.openById('Workbook 1 spreadsheet id');
  var tsh=ss.getSheetByName('sheet 1');
  var ss2=var ss=SpreadsheetApp.openById('Workbook 2 spreadsheet id');
  var tsh2=ss2.getSheetByName('sheet 1');
  var lastRow=tsh.getLastRow();
  var timestamps=tsh.getRange(1,11,lastRow,1).getValues();
  var yesterdayMs=new Date().getTime()-24*60*60*1000;  //get the date from yesterday in ms
  var yesterdayDate=new Date(yesterdayMs);   // get the date from yesterday
  for(var i=lastRow;i>1;i--){              // get the last row from yesterday
    if(new Date(timestamps[i-1][0]).getDay()==yesterdayDate.getDay()){
      var lastRowYesterday=i;
      break;
    }
  }
  for(var j=lastRowYesterday-1;j>1;j--){  // get the first row from yesterday
    if(new Date(timestamps[j-1][0]).getDay()!=yesterdayDate.getDay()){
      var firstRowYesterday=j+1;
      break;
    }
  }
  var rowNumber=lastRowYesterday-firstRowYesterday+1;
  var columnNumber=tsh.getLastColumn();
  var toCopy=tsh.getRange(firstRowYesterday,1,rowNumber,columnNumber).getValues(); //values from yesterday
  var lastRow2=tsh2.getLastRow();
  tsh2.getRange(lastRow2+1,1,rowNumber,columnNumber).setValues(toCopy);  //append to workbook 2
}