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ます。これらのオブジェクトの 2 つが表す日付が同じ場合でも、実際に同じオブジェクトを参照していない限り、オブジェクトの比較は false になります。これについては、 2 つの日付を 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 に答える