Google Apps Script вставляет дату в GSheets, но изменяется на неопределенную - PullRequest
0 голосов
/ 13 марта 2019

Этот код будет вставлять правильные даты в правильные ячейки, но похоже, что после каждого цикла (до перехода к следующей строке) дата меняется на undefined. Это происходит только для var = expDelivery все остальные даты в порядке.

Я не уверен, почему он правильно вставляет дату, а затем меняет на undefined.

function doPost(e){
  //append the ID to your spreadsheet like this:
  var sheetID = e.parameter.sheetid;  
  var ss = SpreadsheetApp.openById(sheetID);
  var sh = ss.getSheetByName("Sheet1");
  var headers = sh.getRange(1,1,1,sh.getLastColumn()).getValues()[0];
  
  var uninstalledCol = headers.indexOf("uninstalledDate");
  
  //get all variables passed from app
  var ft = e.parameter.ftNumber;  
  var measuredDate = new Date(e.parameter.measuredDate);
  var installedDate = new Date(e.parameter.installedDate);
  var uninstalledDate = new Date(e.parameter.uninstalledDate);
  //add 21 days to measuredDate 
  var dayInMs = 24*60*60*1000;    //one day in Milliseconds
  var daysToAdd = 21;  
  var expDelivery = new Date(measuredDate.getTime()+(daysToAdd*dayInMs));  
  
  var shtData = sh.getDataRange();
  var shtVals = shtData.getValues();

  var updatedCols = [];
  
  for(var j = 1; j < shtVals.length; j++) //Loop through rows
  {
    for (var i = 6; i < uninstalledCol; i++)  //Loop through columns
    {
      // IF col 1 of current row = ft AND current cell is blank AND current col title = measuredDate AND value passed with same name as col title IS NOT blank
      if(shtVals[j][0] == ft && shtVals[j][i] == "" && headers[i] == "measuredDate" && e.parameter[headers[i]] != "") 
      {
        shtVals[j][i] = e.parameter[headers[i]];
        shtVals[j][i+1] = expDelivery; //Will set the correct date in spreadsheet but changes to "undefined" before moving to next row
        shtData.setValues(shtVals);
        updatedCols.push([headers[i]]);
      } 
      // IF col 1 of current row = ft AND current cell is blank AND current col title IS NOT "DELIVERED DATE" or "measuredDate" AND value passed with same name as col title IS NOT blank
      else if(shtVals[j][0] == ft && shtVals[j][i] == "" && headers[i] != "DELIVERED DATE" && headers[i] != "measuredDate" && e.parameter[headers[i]] != "")
      {
        shtVals[j][i] = e.parameter[headers[i]];
        shtData.setValue(shtVals);
        updatedCols.push([headers[i]]);
      }
    }
  }

 return message(updatedCols);

}


function message(msg) {
  return ContentService.createTextOutput(JSON.stringify({Result: msg })).setMimeType(ContentService.MimeType.JSON);
}

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Ваш код неэффективен.Вы читаете лист значений один раз здесь var shtVals = sh.getDataRange().getValues();.Затем для каждой строки, для каждого столбца вы снова и снова читаете и записываете значения листа.

for(var j = 1; j < shtVals.length; j++) //Loop through rows
  {
    for (var i = 6; i < uninstalledCol; i++)  //Loop through columns
    {
      {
        // do stuff
      }
      {
        // do stuff
      }
    }
  }
shtData.setValues(data);

Чтение и запись требуют времени, поэтому вы должны свести их к минимуму.Лучший способ - прочитать один раз, выполнить все операции со значениями, а затем написать один раз.

Всегда могут быть особые случаи, и, возможно, вам не нужна скорость.

О проблеме -

Здесь пишется data[j][i+1] = expDelivery;.Это находится во внутреннем цикле, который выполняется несколько раз, как предполагает код.Кажется, что код изменяет столбец за строкой, поэтому маловероятно, что строка будет связываться с предыдущей строкой.Вероятно, это проблема внутреннего цикла, когда столбцы читаются, обрабатываются и записываются.

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

0 голосов
/ 14 марта 2019

Мне нужны значения для перехода к определенным ячейкам, возможно ли это сделать с помощью одной функции записи?

Да.

Допустим, это ваш лист -

    -----------------------------
    | A            | B          |
    -----------------------------
1   | Name         | Age        |
    -----------------------------
2   | Alice        | 25         |
    -----------------------------
3   | Bob          | 30         |
    -----------------------------

Мы делаем var values = sheet.getDataRange().getValues().Мы получаем -

values = [ [ Name,  Age ],
           [ Alice,  25 ],
           [ Bob,    30 ] ]

Допустим, вы хотите изменить A2 на Jane.Какие индексы вы используете для доступа к нему внутри values массива?

Вы можете видеть из листа, его 2-й ряд, 1-й столбец.Но values - это двумерный массив, индексы будут values[1][0], потому что индексы в массивах начинаются с 0 .

Итак, фактические индексы для доступа к A2 внутри values будет values[1][0], строк и столбцов, каждый на 1 меньше строки листа, индексы столбцов .

. Позволяет изменить A2 на Jane.values[1][0] = 'Jane'

Как только вы измените массив values, это изменение будет в реальном времени, в памяти, готово для доступа к другой операции или расчету .Но это еще не записано в лист .

Допустим, вам нужно изменить B2, так как Jane равно 26.Итак, вы делаете это изменение сейчас?Или сначала записать предыдущее изменение в лист?Желательно сделать это изменение сейчас и записать оба изменения в одну операцию.

Теперь, каковы индексы в values для B2 ?.B2 - 2-й ряд, 2-й столбец в листе.В массиве values это values[1][1].

. Позволяет изменить B2 на 26. values[1][1] = 26.Теперь оба изменения живы.Если мы напишем values на листе, оба изменения будут сохранены.

Часть, которая доставляет мне неприятности, когда дело доходит до этого, задает диапазон для установки значений, как сделатьЯ передаю значения [j] и [I] каждой записи.

Теперь вы знаете, как работают листовые индексы и values индексы.Используйте индексы values, чтобы изменить / установить значения, а затем записать values в лист.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...