Мой цикл for в скрипте Google выполняется через код, но не возвращает правильный ответ - PullRequest
0 голосов
/ 23 мая 2019

Я настраиваю цикл, который просматривает 1 электронную таблицу и вычисляет число на основе 2 дат. Затем он открывает другую электронную таблицу (имя неизвестно, но создано с помощью другой функции). на основе числа он идет в определенный столбец, поэтому, если число меньше 7, то столбец 2 (неделя 1), если между 7 и 14 переходит в столбец 3 (неделя 2) и т. д. Затем он вычисляет другое число на основе того, когда Таблица была обновлена ​​в последний раз и форматирует ячейку на основе этого расчета. Затем он открывает следующую таблицу и делает то же самое ... Теоретически! Код перебирает все электронные таблицы, и код разницы выводит правильное число, но он помещает ответ из первой электронной таблицы в каждую из ячеек ... он останавливается, когда он проходит по каждой из электронных таблиц

Я пытался изменить то, откуда он появляется. Я изменил параметры цикла. Я исследовал множество различных возможностей ... но, возможно, смотрел на это слишком долго!

function trackingSheetUpdate() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = ss.getSheetByName('Active Campaign');
var trackSheet = ss.getSheetByName('Tracking');
var now = new Date();
var rowData = sourceSheet.getRange(1, 1, sourceSheet.getLastRow(), 
sourceSheet.getLastColumn()).getValues();


for (var i = 2; i < rowData.length + 1; i++) {
    var createDate = sourceSheet.getRange(i, 6).getValue();
    var NoOfDays = (now - createDate) / (1000 * 60 * 60 * 24); // i've now got the difference between creation date and today's date as a number 
    var diff = Math.round(NoOfDays);
    var getUpdate = sourceSheet.getRange(i, 5).getValue(); //this is getting the URL that needs to be opened
    var openSheet = 
SpreadsheetApp.openByUrl(getUpdate).getSheetByName('Sheet1') // this opens the sheet
    var row = openSheet.getLastRow() // this counts the number of rows in Sheet 1
    var weeklyUpdate = openSheet.getRange(row, 1).getValue(); //this gets the value in column 1 of the last row
    var calc = (now - weeklyUpdate) / (1000 * 60 * 60 * 24) // makes the date into a number (I hope!)
    var calcDate = Math.round(calc) // this rounds it to a whole number
    Logger.log(diff)


    if (diff > 1 && diff <= 7) {
        trackSheet.getRange(i, 2).activateAsCurrentCell()
    } else if (diff > 7 && diff <= 14) {
        trackSheet.getRange(i, 3).activateAsCurrentCell()
    } else if (diff > 14 && diff <= 21) {
        trackSheet.getRange(i, 4).activateAsCurrentCell()
    } else if (diff > 21 && diff <= 28) {
        trackSheet.getRange(i, 5).activateAsCurrentCell()
    } else if (diff > 28 && diff <= 35) {
        trackSheet.getRange(i, 6).activateAsCurrentCell()
    } else if (diff > 35 && diff <= 42) {
        trackSheet.getRange(i, 7).activateAsCurrentCell()
    } else if (diff > 42 && diff <= 49) {
        trackSheet.getRange(i, 8).activateAsCurrentCell()
    } else if (diff > 49 && diff <= 56) {
        trackSheet.getRange(i, 9).activateAsCurrentCell()
    } else if (diff > 56 && diff <= 63) {
        trackSheet.getRange(i, 10).activateAsCurrentCell()
    } else if (diff > 63 && diff <= 70) {


    if (calcDate <= 7) {

trackSheet.getCurrentCell().setValue("Y").setBackground('#9EEF95')
    } else {

trackSheet.getCurrentCell().setValue("N").setBackground('#F65A5A')
    }
}
}

Из электронных таблиц, которые у меня есть, должны отображаться некоторые данные в столбцах 1, 2 и 3 .., но отображаются только данные в столбце 3

1 Ответ

0 голосов
/ 23 мая 2019

В вашем коде, как опубликовано, единственные очевидные проблемы заключаются в том, что ваши конечные setValue() s находятся в последнем else if блоке (63-70 дней), и вы пропускаете } в конце вашего функция. Убедитесь, что это не так в скрипте Google Apps; если это так, вторая наиболее вероятная проблема заключается в том, что информация на вашем листе не отличается от того, что вы думаете. Попробуйте использовать Logger.log() для значений, которые вы читаете, чтобы убедиться, что они соответствуют вашим ожиданиям.

Дополнительные советы: проверьте Лучшие практики ГАЗ ; особенно при использовании пакетных операций - например, вы получите лучшие результаты, считывая только те значения, которые вам нужны с первого листа в одном getValues(), а затем итерируя по этим массивам (например, array[i][0]), вместо использования отдельных звонки на getValue() в каждом цикле. Я также не уверен, где вы намереваетесь использовать rowData в этом сценарии - это большая просьба просто проверить длину (по сравнению, например, с одним столбцом).

Я бы также порекомендовал заменить все эти операторы if, например,

var weeknum = (diff-(diff%7))/7 + 1;
var myCell =  trackSheet.getRange(i, weeknum)

calcDate <= 7 ? myCell.setValue("Y").setBackground('#9EEF95') : myCell.setValue("N").setBackground('#F65A5A')

Это очень поможет с разборчивостью и позволит избежать ошибок, подобных этой.

В качестве примера того, что я имею в виду, проверьте приведенный ниже код (не проверено; могут потребоваться небольшие корректировки / исправления:

function trackingSheetUpdate() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sourceSheet = ss.getSheetByName('Active Campaign');
  var trackSheet = ss.getSheetByName('Tracking');
  var now = new Date();
  var createDates = sourceSheet.getRange(2, 6, sourceSheet.getLastRow()-1).getValues();
  var urls = sourceSheet.getRange(2, 5, sourceSheet.getLastRow()-1).getValues(); 

  for (var i = 2; i < urls.length; i++) {
      var NoOfDays = (now - createDates[(i-2)][0]) / (1000 * 60 * 60 * 24);
      var diff = Math.round(NoOfDays);    
      var openSheet = SpreadsheetApp.openByUrl(urls[(i-2)][0]).getSheetByName('Sheet1');
      var row = openSheet.getLastRow();
      var weeklyUpdate = openSheet.getRange(row, 1).getValue();
      var calc = (now - weeklyUpdate) / (1000 * 60 * 60 * 24);
      var calcDate = Math.round(calc);
      Logger.log(diff)

      var weeknum = (diff-(diff%7))/7 + 1;
      var myCell =  trackSheet.getRange(i, weeknum)
      calcDate <= 7 ? myCell.setValue("Y").setBackground('#9EEF95') : myCell.setValue("N").setBackground('#F65A5A')
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...