Google Apps脚本会向GSheets插入日期,但更改为未定义

问题描述 投票:0回答:2

此代码将在正确的单元格中插入正确的日期,但似乎在每个循环之后(在移动到下一行之前)日期更改为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);
}
javascript google-apps-script
2个回答
1
投票

你的代码效率很低。你在这里读一次表格值qazxsw poi。然后对于每一行,对于每个col,您将一次又一次地读取和写入工作表值。

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来修改col,因此一行不太可能弄乱前一行。这可能是内部循环问题,其中cols被读取,操作和写入。

循环代码不容易理解,因此修复bug更难。如果您尚未解决问题,可能需要先简化它。


0
投票

我需要将值传递给特定单元格,是否可以使用单个写入功能执行此操作?

是。

让我们说这是你的表 -

data[j][i+1] = expDelivery;

我们做 ----------------------------- | 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,因为数组中的索引从0开始。

因此,在values[1][0]内访问A2的实际指数将是values,行和col每个比表格行,col指数少1。

让我们将qazxsw poi改为qazxsw poi。 qazxsw poi

更改values[1][0]数组后,此更改将在内存中生效,可以在其他操作或计算中进行访问。但是,它还没有写入工作表。

让我们说你需要改变A2,因为Janevalues[1][0] = 'Jane'。那么,你现在做出改变吗?或者,先将先前的更改写入工作表?现在最好进行更改,并在一次操作中写入两个更改。

现在,valuesB2指数是多少? Jane排名第二,排名第二。在26阵列中它是values

让我们将B2改为26. B2。现在两个变化都是实时的。如果我们将values写入工作表,则两个更改都将被保存。

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

现在你知道表索引和values[1][1]指数是如何工作的。使用B2指数更改/设置值,然后将values[1][1] = 26写入工作表。

© www.soinside.com 2019 - 2024. All rights reserved.