簡體   English   中英

為在不同工作表上找到的多個搜索詞運行腳本

[英]Running script for multiple search terms found on different sheet

我正在嘗試從SCORESHEET填充REPORTSHEET ,使用REFERENCESHEET來整理搜索詞和目標單元格。

我正在運行的腳本如下。 這個想法是腳本在REFERENCESHEET中找到searchDate並使用它們來定位REPORTSHEET中的數據列:

function superAuto() {
  var report = SpreadsheetApp.openById('REPORTSHEET');
  var reportData = report.getDataRange().getValues();

  var reference = SpreadsheetApp.openById('REFERENCESHEET');
  var referenceData = reference.getDataRange().getValues();

  var scorecard = SpreadsheetApp.openById('SCORESHEET');
  var scorecardData = scorecard.getDataRange().getValues();

  var tExpenses = "Total Expenses";

  for(n=0;n<referenceData.length;++n){
    var searchDate = referenceData[n][0] ;
    Logger.log (searchDate)
  }

  var column = columnfinder(searchDate);

  for (var a = 0; a < referenceData.length; a++) {
    var refRow = referenceData[a];
   for (var i = 0; i < reportData.length; i++) {
    var row = reportData[i];
    if (row[0] == tExpenses && refRow[0] == searchDate) {
      scorecard.getRange(refRow[5]).setValue(row[column]);
    }
   }
  }
}

function columnfinder(find) {
  var report = SpreadsheetApp.openById('REPORTSHEET');
  var reportData = report.getDataRange().getValues();

  var reference = SpreadsheetApp.openById('REFERENCESHEET');
  var referenceData = reference.getDataRange().getValues();

  
    for(var j=0, jLen=reportData.length; j<jLen; j++) {
      for(var k=0, kLen=reportData[0].length; k<kLen; k++) {
        if(find == reportData[j][k]) {
          Logger.log(k);
          return (k);}
      }
    }
  }

從廣義上講,代碼有效,就好像我將searchDate定義為我正在尋找的術語之一(例如 Jan-21),它一切正常。 問題在於,在查找多個搜索詞時似乎並沒有這樣做 - 因此填充多行 - 根據:

for(n=0;n<referenceData.length;++n){
    var searchDate = referenceData[n][0] ;
    Logger.log (searchDate)
  }

日志告訴我它在 REFERENCESHEET 中找到searchDate ,但它無法通過function columnfinder運行它們(我沒有得到第二個記錄器的日志)。

我懷疑答案就在我收到的對這個想法的早期版本的一個很好的答案中的某個地方—— 如何為 setValue 返回多個列值——但我無法讓它適合。 有什么想法嗎?

編輯:請查找示例參考表和報告表以獲取更多信息:

參考表報告單

日志告訴我它在 REFERENCESHEET 中找到了 searchDate,但它無法通過 function columnfinder 運行它們(我沒有得到第二個記錄器的日志)

不會for循環內執行columnfinder

嘗試這個:

for(n=0;n<referenceData.length;++n){
    var searchDate = referenceData[n][0] ;
    Logger.log(searchDate);
    columnfinder(searchDate); // modified code
  }

你會得到兩個logs

對不起,如果我誤解了你的問題。

您需要使用將其分配給array ,因為您可能返回多個列/日期:

function superAuto() {
  var report = SpreadsheetApp.openById('REPORTSHEET');
  var reportData = report.getDataRange().getValues();

  var reference = SpreadsheetApp.openById('REFERENCESHEET');
  var referenceData = reference.getDataRange().getValues();

  var scorecard = SpreadsheetApp.openById('SCORESHEET');
  var scorecardData = scorecard.getDataRange().getValues();

  var tExpenses = "Total Expenses";

  var searchDates = [];

  for (n = 0; n < referenceData.length; ++n) {
    searchDates.push(referenceData[n][0])
  }

  var columns = columnfinder(searchDates);

  columns.forEach(function (column, index) {
    referenceData.forEach(function (refRow) {
      reportData.forEach(function (row) {
        if (row[0] == tExpenses && refRow[0] == searchDates[index]) {
          scorecard.getRange(refRow[5].toString()).setValue(row[column]);
        }
      });
    });
  });
}

function columnfinder(dates) {
  var report = SpreadsheetApp.openById('REPORTSHEET');
  var reportData = report.getDataRange().getValues();

  var reference = SpreadsheetApp.openById('REFERENCESHEET');
  var referenceData = reference.getDataRange().getValues();

  var columns = [];

  dates.forEach(function (date) {
    reportData.forEach(function (row, i) {
      row.forEach(function (col, i) {
        if (date == reportData[i][j]) {
          columns.push(reportData[i][j]);
        }
      });
    });
  });

  return columns;
}

我將一些變量更改為正確的變量名稱以避免混淆。

此外,如果它不起作用,您可能需要共享數據的適當可視化,或者更好的是,提供一些我們可以處理的樣本表,以便我們能夠為您提供更好且經過測試的答案。

謝謝馬里奧斯,這是一周兩次。 非常感激。

稍作調整,為了讓它填充SCORECARD ,我需要將所有內容都帶入for循環,如下所示:

 for(n=0;n<referenceData.length;++n){
    var searchDate = referenceData[n][0] ;
    Logger.log (searchDate)
    var column = columnfinder(searchDate);

  for (var a = 0; a < referenceData.length; a++) {
    var refRow = referenceData[a];

   for (var i = 0; i < reportData.length; i++) {
    var row = reportData[i];
    if (row[0] == tExpenses && refRow[0] == searchDate) {
      scorecard.getRange(refRow[5]).setValue(row[column]);
    }
   }
  }
 }

暫無
暫無

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

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