根据今天的日期在谷歌电子表格中移动一行

时间:2017-04-02 20:20:06

标签: google-apps-script google-sheets

我试图根据今天的日期值在同一个电子表格中将一行数据从一张纸移动到另一张。

在#34; A"栏中,我有一个约会。如果在#34; A"列中输入日期,我想移动该行比今天的日期要早。 (它是飞机的航班时刻表,我想把已经发生的航班转移到名为"过往航班"的表格上。)活动表的名称是"航班时刻表&#34 ;

移动行后,我希望它删除"航班时刻表"片。我知道在哪里添加脚本,但不知道如何实现这一点。

这是我尝试过的。我认为在线"如果(data.link> 1 ..." data.link不是正确使用的。但是我找不到用于表示比今天约会。

function approveRequests() {
 var ss = SpreadsheetApp.getActiveSpreadsheet()
 sheet = ss.getActiveSheet(),
 sheetName = sheet.getName(),
 data = sheet.getDataRange().getValues();
 if (sheetName == "Flight Shedule") {
  var range = sheet.getActiveRange(),
  startRow = range.getRowIndex(),
  numRows = range.getNumRows(),
  numCols = range.getNumColumns()
  if (numCols == 9) {
   if (data.length > 1) {
    var values = range.getValues(),
    nextSheet = ss.getSheetByName("Past Flight"),
    lastRow = nextSheet.getLastRow();
nextSheet.getRange(lastRow+1,1,numRows,3).setValues(values);
sheet.deleteRows(startRow,numRows);
   } 
  } 
 } 
}

任何帮助都会很大!

谢谢!

2 个答案:

答案 0 :(得分:1)

好的,我会先根据您当前的代码提供一些常规技巧。

在您的功能中,您执行sheet = ss.getActiveSheet()这是多余的,因为您已经拥有SpreadsheetApp.getActiveSpreadsheet()。我还建议您避免这种情况

var ss = SpreadsheetApp.getActiveSpreadsheet()
 sheet = ss.getActiveSheet(),
 sheetName = sheet.getName(),
 data = sheet.getDataRange().getValues();

支持这一点:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var sheetName = sheet.getName();
var data = sheet.getDataRange().getValues();

更容易阅读和更改而不会出错。

data.length与当前日期无关,它只是数组的长度。因此,如果您选择1行数据,则为1,如果您选择2行,则为2等。.getValues()将返回data[row][col]的数组。您正在寻找的是获取飞行时间的价值,将其转换为日期对象(不是谷歌特定的东西,只是一般的javascript)。然后使用var now = new Date()并比较两者。

我还建议您重新考虑一下if语句。获取行数据有许多比手动选择行然后运行该函数更好的方法。如果您决定实际自动运行,则可以保存大量代码行,因为实际上它只会在手动调用时运行。

答案 1 :(得分:0)

此示例正在运行:

function approveRequests() {

  // Initialising
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var scheduleSheet = ss.getSheetByName("Flight Shedule");
  var pastSheet = ss.getSheetByName("Past Flight");
  var lastColumn = scheduleSheet.getLastColumn();

  // Check all values from your "Flight Schedule" sheet
  for(var i = scheduleSheet.getLastRow(); i > 0; i--){

    // Check if the value is a valid date
    var dateCell = scheduleSheet.getRange(i, 1).getValue();
    if(isValidDate(dateCell)){
      var today = new Date();
      var test = new Date(dateCell);

      // If the value is a valid date and is a past date, we remove it from the sheet to paste on the other sheet
      if(test < today){

        var rangeToMove = scheduleSheet.getRange(i, 1, 1, scheduleSheet.getLastColumn()).getValues();
        pastSheet.getRange(pastSheet.getLastRow() + 1, 1, 1, scheduleSheet.getLastColumn()).setValues(rangeToMove);
        scheduleSheet.deleteRow(i);

      }
    }
  }
}

// Check is a valid date
function isValidDate(value) {
  var dateWrapper = new Date(value);
  return !isNaN(dateWrapper.getDate());
}

是的,这不是优化的解决方案(使用多个sheet.getRange()方法的原因),但它正在工作并允许有一个清晰的代码。