此代码将在正确的单元格中插入正确的日期,但似乎在每个循环之后(在移动到下一行之前)日期更改为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);
}
你的代码效率很低。你在这里读一次表格值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更难。如果您尚未解决问题,可能需要先简化它。
我需要将值传递给特定单元格,是否可以使用单个写入功能执行此操作?
是。
让我们说这是你的表 -
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
,因为Jane
是values[1][0] = 'Jane'
。那么,你现在做出改变吗?或者,先将先前的更改写入工作表?现在最好进行更改,并在一次操作中写入两个更改。
现在,values
的B2
指数是多少? Jane
排名第二,排名第二。在26
阵列中它是values
。
让我们将B2
改为26. B2
。现在两个变化都是实时的。如果我们将values
写入工作表,则两个更改都将被保存。
在这方面给我带来麻烦的部分是指定设置值的范围,如何传递每个条目的[j]和[I]值。
现在你知道表索引和values[1][1]
指数是如何工作的。使用B2
指数更改/设置值,然后将values[1][1] = 26
写入工作表。