簡體   English   中英

無法根據Google電子表格中的日期過濾主表格中其他spreadhseet粘貼的數據

[英]Unable to filter data from other spreadhseet paste in master sheet based on dates in google spreadsheet

首先感謝您在本網站所做的努力。 作為個人和初學者,我從錯誤中吸取了教訓。 感謝所有貢獻和擴展支持的人。 謝謝你。

這是一個小程序寫的不工作(沒有輸出),我已經嘗試過很多方面但是徒勞無功。 請幫我找到解決方案。 該計划的目的是從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]);
    }
  }
}

基本問題是您要比較對象是否相等 - 在這種情況下,您要比較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[]數組中覆蓋前一天的值。 我不確定你試圖滿足這個要求是什么,所以我不管它,但需要注意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM