【问题标题】:How to get an array of data in google sheets based on date in column?如何根据列中的日期在谷歌表格中获取一组数据?
【发布时间】:2020-01-02 18:36:01
【问题描述】:

我每天都在尝试将数据的子部分从一个谷歌表拉到另一个。拉取是基于日期的,这就是我挣扎的原因。

上下文 - 我有一个“工作簿 1”,每天记录不同 NBA 球队的价格数据。每天都会捕获数据并将其添加到表格的底部(因此最新的价格数据位于底部)。它在 K 列中带有日期标记,=today().. 标题为“Pull Date”。

我有一个单独的工作簿,我们将其称为 NBA 的“工作簿 2”,我想在其中包含来自工作簿 1 的相同价格数据,但仅限于过去 15 天(以使其更加灵活)。为此,我想让脚本每天早上将昨天的值从“工作簿 1”逐渐添加到“工作簿 2”(现在我将手动删除任何超过 15 天的行)。

目的 - 由于 Workbook 1 文件太大(可追溯到几个月前),我已在 Workbook 2 中的表格上构建了一份报告,并进行了为期两周的分析。

问题 - 我有一些来自不相关工作簿的旧代码,我将数据从一张表拉到另一张表,但它不是基于拉取日期的条件。对于此脚本,我希望我的“工作簿 2”工作簿从“工作簿 1”请求数据并将其添加到“工作簿 2”的工作表 1 的底部,但仅适用于包含昨天日期的行(或 =today()- 1)。包含昨天日期的行数是动态的,并且会随着时间的推移而缩小,所以我今天没有像上周那样移动相同的行数。

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

function runOne() { 
  var ss=SpreadsheetApp.openById('Workbook 1 sheet id');
  var tsh=ss.getSheetByName('sheet 1');
  ???

我不知道如何有条件地提取昨天的数据并使行数动态化。获得正确的值后,我需要将其粘贴到“工作簿 2”中标题为“工作表 1”的选项卡底部。

我对脚本编写的经验很少,因此我们将不胜感激。我试图尽可能地澄清以上内容,但如果需要进一步澄清,请告诉我。

【问题讨论】:

  • 您能分享一个指向示例电子表格的链接吗?
  • 当然,here you go。这是一个小得多的样本(只有 156 行而不是 18,000 行),但概念和格式是相同的。我已经按拉日期排序。这是工作簿 1(主数据工作簿),但工作簿 1 和 2 的格式相同。工作簿 2 将调用工作簿 1 中的数据。
  • 您看过表格query 功能吗?您可以在第一个工作簿的另一张工作表上使用它来过滤源数据。 support.google.com/docs/answer/3093343?hl=en
  • 共享电子表格的样本副本。
  • @cooper 我在上面的评论中分享了。点击链接。 (忘记标记你了)。

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


【解决方案1】:
  • 您的日期戳在第 11 (K) 列中
  • 您想每天自动运行脚本(准时触发)
  • 您想将具有昨天时间戳的工作簿 1 表 1 中的条目添加到工作簿 2 表 1

你可以这样实现它

  • 编写一个代码,计算从昨天开始的日期并将其与 K 列中的时间戳进行比较
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
}

【讨论】:

  • 嗨@ziganotschka 感谢您的评论,很抱歉几天后我才有机会运行它。我在第 4 行遇到语法错误。知道为什么吗?跨度>
  • 嗨@ziganotschka 我调整了脚本以修复错误,但由于某种原因,它从 12/7 开始,而不是昨天。 *更新脚本第 4 行和第 5 行:var ss2=SpreadsheetApp.openById('Workbook 2 spreadsheet id'); var tsh2=ss2.getSheetByName('sheet 1');
  • 我认为语法错误是因为您没有通过第二个工作簿的真实 ID 正确替换“工作簿 2 电子表格 ID”。如果“工作表 1”不是您在工作簿 2 中感兴趣的工作表的名称 - 请相应地替换名称。注意区分大小写!例如。 “工作表 1”与“工作表 1”不同,“工作表 1”与“工作表 1”不同。
  • 嗨@ziganotschka - 我今天早上再次运行它并且它正在工作。非常感谢帮助我的朋友,你是一个救生员!我已将您的评论标记为答案。
  • 最后一个问题@ziganotschka。该代码在我的示例工作簿中有效,但是当我将其带到实际工作簿时,它会以不同的格式粘贴日期字段。它正在获取正确的数据(昨天),但粘贴后的日期显示为“1/4/2020 23:00:00”。有什么想法可以解决这个问题吗?我尝试重新格式化整个列,但没有运气。同样,它正在获取正确的数据(原始工作簿中的 2020 年 1 月 5 日),但粘贴为 2020 年 1 月 4 日 23:00:00。
猜你喜欢
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多