Google Apps脚本在GSheets中插入了一个日期,但更改为undefined

时间:2019-03-13 20:15:36

标签: javascript google-apps-script

此代码将在正确的单元格中插入正确的日期,但似乎在每个循环之后(移至下一行之前),日期更改为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 个答案:

答案 0 :(得分:1)

您的代码是如此低效。您在RequestMessage处读取工作表值。然后,对于每一行,对于每个列,您一次又一次地读取和写入工作表值。

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); 。如代码所示,这在内部循环中运行了几次。代码似乎逐行修改col,因此一行不太可能与前一行混淆。这可能是内部循环问题,cols被读取,操纵和写入。

循环代码不容易理解,因此,修复错误变得更加困难。如果您尚未解决此问题,则可以先简化一下。

答案 1 :(得分:0)

我需要将值转到特定的单元格,是否可以使用单个写入功能来完成此操作?

是的

让我们说这是您的工作表-

    -----------------------------
    | 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数组中使用哪些索引来访问它?

您可以从工作表的第二行第一栏看到。但是values是一个二维数组,索引将是 values[1][0],因为数组中的索引以0开头

因此,在A2内部访问values的实际索引将是values[1][0]行和列的长度要比工作表行的列索引少1,列索引。< / p>

让我们将A2更改为Janevalues[1][0] = 'Jane'

更改values数组后,此更改将实时存在于内存中,可以通过其他操作或计算进行访问。但是,它尚未写入工作表

让我们说您需要更改B2,因为Jane26。那么,您现在进行更改吗?或者,首先将先前的更改写到工作表中?最好是立即进行更改,并在一个操作中将两个更改都写入。

现在,valuesB2的索引是什么? B2是工作表的第二行,第二列。在values数组中为values[1][1]

B2更改为26。values[1][1] = 26。现在,两个更改都已生效。如果我们将values写到工作表中,两个更改都将被保存。

给我带来麻烦的部分是指定设置值的范围,如何传递每个条目的[j]和[I]值。

现在,您知道工作表索引和values索引的工作方式。使用values索引来更改/设置值,然后将values写到表中。