【问题标题】:Add future date in Google script and Goggle Sheet在 Google 脚本和 Google 表格中添加未来日期
【发布时间】:2020-11-08 16:41:53
【问题描述】:

我使用 Google 表格 和 Cryptofinance.ai 来检索加密货币价格。我有一个运行良好的脚本:它会定期从选项卡 A 的一行中附加数据,以将它们保存在选项卡 B 中,这样我就可以制作图形和图表。

现在我想在下一行添加日期 + 1 年。理想情况下,每次触发脚本时,它都会创建两个新行:一个包含现在的数据,另一个包含日期 + 1 年。

如果您好奇并想知道我为什么要这样做,就是使用它来制作投影价格 另一个选项卡中的公式:=TREND(filter(B2:B,B2:B<>""),filter(A2:A,B2:B<>""),filter(A2:A,(N(B2:B)=0)*(A2:A>0)))

这是我的脚本:

    // [START modifiable parameters]
    var rangeToLog = 'Portefeuille!A28:L28';
    var sheetToLogTo = 'Archive BTC/USD KRAKEN';
    // [END modifiable parameters]
    ////////////////////////////////
    
    /**
    * Appends a range of values to the end of an archive sheet.
    * A timestamp is inserted in column A of each row on the archive sheet.
    * All values in rangeToLog go to one row on the archive sheet.
    *
    * @OnlyCurrentDoc
    */
    function appendValuesToArchiveBTCUSDKRAKENSheet() {
      // version 1.4, written by --Hyde, 30 January 2020
      //  - use Array.prototype.some() to skip empty rows when concating
      //  - see https://support.google.com/docs/thread/27095918?msgid=27148911
      // version 1.3, written by --Hyde, 26 January 2020
      //  - see https://support.google.com/docs/thread/26760916
      var ss = SpreadsheetApp.getActive();
      var valuesToLog = ss.getRange(rangeToLog).getValues();
      var logSheet = ss.getSheetByName(sheetToLogTo);
      if (!logSheet) {
        logSheet = ss.insertSheet(sheetToLogTo);
        logSheet.appendRow(['Date time', 'Data']);
      }
      var rowToAppend = [new Date()].concat(
        valuesToLog.reduce(function concatArrays_(left, right) {
          var arrayContainsData = right.some(function isNonBlanky_(element, index, array) {
            return element !== null && element !== undefined && element !== '';
          });
          return arrayContainsData ? left.concat(right) : left;
        })
      );
      logSheet.appendRow(rowToAppend);
    }

现在:

我想做的事:

【问题讨论】:

  • 您的问题到底是什么?修改日期还是打印第二行?
  • 我猜都是 :) 我希望脚本添加 2 行:一个带有价格,另一个带有未来日期的一年。

标签: date google-apps-script google-sheets automation google-finance


【解决方案1】:

简单的解决方法是在函数末尾添加另一个 appendRow() 调用,并使用 one year from now 值。

function appendValuesToArchiveBTCUSDKRAKENSheet() {
  // ... 
  logSheet.appendRow(rowToAppend);
  logSheet.appendRow([new Date(new Date().setFullYear(new Date().getFullYear() + 1))]);
}

一个更复杂但执行时间更短的解决方案是让您在一个 setValues() 调用中打印两行。这遵循using batch operations 的最佳实践,但我怀疑上述更简单的解决方案足以满足您的目的。但是,如果您想提高应用脚本技能,我鼓励您尝试实施批处理操作。

【讨论】:

  • 谢谢,效果很好!现在我可能需要删除脚本开头的最后一行,因为我上线的是数据,一行是日期,一行是数据,一行是日期,等等。我查看了 devellopers.google.com 并找到了一个可以解决问题的 deleteRow 类。 1 我从最后一个脚本中删除日期 2 我附加一行数据 3 我附加一行日期 语言对我来说真的很难阅读,猜猜我必须把删除类放在哪里......请你帮帮我?
  • deleteRow 需要行的位置,这里是最后一个。我现在尝试让它与 getLastRow 类一起工作,但我真的不知道我在做什么!大声笑
【解决方案2】:

最后,经过一番研究,我得出了这个结论:

function expCalc(){
 delLastNRows();
 appendValuesToArchiveBTCUSDKRAKENSheet();
}



function delLastNRows(n){
  var n=n || 1;//allows you to delete last three rows without passing function a parameter.
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Archive BTC/USD KRAKEN');
  var lr=sh.getLastRow();
  if(lr>=n){
    for(var i=0;i<n;i++){
      sh.deleteRow(sh.getLastRow());
    }
  }
}


// [START modifiable parameters]
var rangeToLog = 'Portefeuille!A28:L28';
var sheetToLogTo = 'Archive BTC/USD KRAKEN';
// [END modifiable parameters]
////////////////////////////////

/**
* Appends a range of values to the end of an archive sheet.
* A timestamp is inserted in column A of each row on the archive sheet.
* All values in rangeToLog go to one row on the archive sheet.
*
* @OnlyCurrentDoc
*/

function appendValuesToArchiveBTCUSDKRAKENSheet() {
  // version 1.4, written by --Hyde, 30 January 2020
  //  - use Array.prototype.some() to skip empty rows when concating
  //  - see https://support.google.com/docs/thread/27095918?msgid=27148911
  // version 1.3, written by --Hyde, 26 January 2020
  //  - see https://support.google.com/docs/thread/26760916
  var ss = SpreadsheetApp.getActive();
  var valuesToLog = ss.getRange(rangeToLog).getValues();
  var logSheet = ss.getSheetByName(sheetToLogTo);
  var sheet = ss.getSheets()[0]
  if (!logSheet) {
    logSheet = ss.insertSheet(sheetToLogTo);
    logSheet.appendRow(['Date time', 'Data']);
  }
  var rowToAppend = [new Date()].concat(
    valuesToLog.reduce(function concatArrays_(left, right) {
      var arrayContainsData = right.some(function isNonBlanky_(element, index, array) {
        return element !== null && element !== undefined && element !== '';
      });
      return arrayContainsData ? left.concat(right) : left;
    })
  );
  logSheet.appendRow(rowToAppend);

  logSheet.appendRow([new Date(new Date().setFullYear(new Date().getFullYear() + 1))]);
}

像魅力一样工作!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多