此代码将在正确的单元格中插入正确的日期,但似乎在每个循环之后(移至下一行之前),日期更改为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);
}
答案 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
更改为Jane
。 values[1][0] = 'Jane'
更改values
数组后,此更改将实时存在于内存中,可以通过其他操作或计算进行访问。但是,它尚未写入工作表。
让我们说您需要更改B2
,因为Jane
是26
。那么,您现在进行更改吗?或者,首先将先前的更改写到工作表中?最好是立即进行更改,并在一个操作中将两个更改都写入。
现在,values
中B2
的索引是什么? B2
是工作表的第二行,第二列。在values
数组中为values[1][1]
。
让B2
更改为26。values[1][1] = 26
。现在,两个更改都已生效。如果我们将values
写到工作表中,两个更改都将被保存。
给我带来麻烦的部分是指定设置值的范围,如何传递每个条目的[j]和[I]值。
现在,您知道工作表索引和values
索引的工作方式。使用values
索引来更改/设置值,然后将values
写到表中。