0

首先感谢您为本站所做的努力。作为个人和初学者,我从我所犯的错误中吸取了教训。感谢所有做出贡献并提供支持的人。谢谢你。

这是一个编写的小程序,它无法正常工作(没有输出),我已经尝试了很多方法但徒劳无功。请帮我找到解决方案。该程序的目的是从 4 张表格中过滤数据并粘贴到当前表格(主表格)中。此过滤器基于日期值。

日期条件取自 (b2 & d2) 日期列中的主表。这将根据客户表中包含日期的第 18 列进行过滤。

function myFunction3() {

var source = ['0AjkkHlm3kCphdGhSWnlxWmFsakZ2aFhMSHl6SlF3M1E',
                '0AjkkHlm3kCphdHY2aXpjTVJEMlFRYVBST0ZPYzNwRFE',
                '0AjkkHlm3kCphdEc5ZHFpeHVlc241SlFKWGJDeXFKLXc',
                '0AjkkHlm3kCphdG9WVjVRRnQ3RlFlcllhd1JGallXVmc'];

var ss = SpreadsheetApp.getActiveSpreadsheet();
// get start date from sheet
var sDate = ss.getSheetByName('123').getRange("B2").getValue();
// get end date from sheet
var eDate = ss.getSheetByName('123').getRange("D2").getValue();
// days between
var Dura = ss.getSheetByName('123').getRange("E1").getValue(); 

  var codes = new Array();

  for (var k = 0; k < Dura; k++){ 
      var d = new Date(sDate);
      d.setDate(d.getDate()+ k);
      codes[k] = d;
  }

  var numCodes = codes.length;
  var copied = [];
  for (var k = 0; k < numCodes; k++) {
    copied[k] = [];
  }

//get data from external sheets for comparision
  for (var i = 0; i < source.length; i++) {
    var tempCopy = SpreadsheetApp.openById(source[i]).getSheetByName('Footfall-Format').getDataRange().getValues();
    // comparision starts
    for (var j = 0; j < tempCopy.length; j++) {
      var codeIndex = codes.indexOf(tempCopy[j][5]);
      if (codeIndex > -1) copied[codeIndex].push(tempCopy[j]);
    }
  }
  var sheets = SpreadsheetApp.getActive().getSheets();
  for (var m = 0; m < numCodes; m++) {
    if (copied[m][0] != undefined) {
      var gensheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('123');
      gensheet.getRange(5, 1, 1500, 18).clear({contentsOnly:true});
      gensheet.getRange(5, 1, copied[m].length, copied[m][0].length).setValues(copied[m]);
    }
  }
}
4

1 回答 1

2

基本问题是您正在比较对象是否相等 - 在这种情况下,您正在比较Date对象。即使其中两个对象表示的日期相同,对象比较也会出现错误,除非您实际上引用的是同一个对象您可以在使用 JavaScript 比较两个日期中了解更多信息。

这是您的脚本的一个简单更改,使用toDateString(),这将确保您的codes[]数组包含可以与 中的值进行比较的字符串值tempCopy[j][5]

function myFunction3() {

var source = ['0AjkkHlm3kCphdGhSWnlxWmFsakZ2aFhMSHl6SlF3M1E',
                '0AjkkHlm3kCphdHY2aXpjTVJEMlFRYVBST0ZPYzNwRFE',
                '0AjkkHlm3kCphdEc5ZHFpeHVlc241SlFKWGJDeXFKLXc',
                '0AjkkHlm3kCphdG9WVjVRRnQ3RlFlcllhd1JGallXVmc'];

var ss = SpreadsheetApp.getActiveSpreadsheet();
// get start date from sheet
var sDate = ss.getSheetByName('123').getRange("B2").getValue();
// get end date from sheet
var eDate = ss.getSheetByName('123').getRange("D2").getValue();
// days between
var Dura = ss.getSheetByName('123').getRange("E1").getValue(); 

  var codes = new Array();

  for (var k = 0; k < Dura; k++){ 
      var d = new Date(sDate);
      d.setDate(d.getDate()+ k);
      codes[k] = d.toDateString(); //***** Make array of Strings, not Dates
  }

  var numCodes = codes.length;
  var copied = [];
  for (var k = 0; k < numCodes; k++) {
    copied[k] = [];
  }

//get data from external sheets for comparision
  for (var i = 0; i < source.length; i++) {
    var tempCopy = SpreadsheetApp.openById(source[i]).getSheetByName('Footfall-Format').getDataRange().getValues();
    // comparision starts
    for (var j = 4; j < tempCopy.length; j++) {  // start at 4 to skip headers
      if (typeof tempCopy[j][5] != "object") break;   // skips strings, but could improve
      // Search for String match of date from input record
      var codeIndex = codes.indexOf(tempCopy[j][5].toDateString());
      if (codeIndex > -1) copied[codeIndex].push(tempCopy[j]);
    }
  }
  // This part has bugs... each day overwrites the previous
  var sheets = SpreadsheetApp.getActive().getSheets();
  for (var m = 0; m < numCodes; m++) {
    if (copied[m][0] != undefined) {
      var gensheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('123');
      gensheet.getRange(5, 1, 1500, 18).clear({contentsOnly:true});
      gensheet.getRange(5, 1, copied[m].length, copied[m][0].length).setValues(copied[m]);
    }
  }
}

正如@Serge 指出的那样,此代码中还有其他问题。

  • d.getDate()+ k不处理月末,所以你需要自己做。
  • setValues()需要调试处理输出的脚本的最后一部分。实际上,每天都会覆盖copied[]数组中前一天的值。我不确定你试图满足什么要求,所以我不理会它,但它需要注意。
于 2012-12-23T17:09:35.667 回答