From your showing error message of Exception: The parameters (null,number,number,number) don't match the method signature for SpreadsheetApp.Sheet.getRange.
, it is considered that in your script, the cells "I2:I" + datasheet.getLastRow()
are not empty. By this, freeRow
of datasheet.getRange(freeRow, 9, 1, 1).setValues(values);
is null
, and such an error occurs. I thought that this might be the reason for your issue.
About your question of Could you please tell me how to fix it?
, if you want to avoid this error by modifying your showing script, how about the following modification?
Pattern 1:
From First one works just fine
, in this pattern, when freeRow
is null
, the last row is put into freeRow
. For this, please modify as follows.
From:
var freeRow;
var columnI = datasheet.getRange("I2:I" + datasheet.getLastRow()).getDisplayValues().flat();
for(var i = 0; i < columnI.length; i++){
if(columnI[i] == "") {
freeRow = i + 1;
break;
}
}
To:
var lastRow = datasheet.getLastRow();
var freeRow;
var columnI = datasheet.getRange("I2:I" + lastRow).getDisplayValues().flat();
for (var i = 0; i < columnI.length; i++) {
if (columnI[i] == "") {
freeRow = i + 1;
break;
}
}
freeRow = freeRow || lastRow;
- Or, is your expected result
freeRow = freeRow || lastRow + 1;
?
Pattern 2:
In this pattern, when freeRow
is null
, the script is stopped. For this, please modify as follows.
From:
var freeRow;
var columnI = datasheet.getRange("I2:I" + datasheet.getLastRow()).getDisplayValues().flat();
for(var i = 0; i < columnI.length; i++){
if(columnI[i] == "") {
freeRow = i + 1;
break;
}
}
To:
var freeRow;
var columnI = datasheet.getRange("I2:I" + datasheet.getLastRow()).getDisplayValues().flat();
for (var i = 0; i < columnI.length; i++) {
if (columnI[i] == "") {
freeRow = i + 1;
break;
}
}
if (!freeRow) return;
Note:
- From your question, unfortunately, I couldn't understand your expected situation. So, I proposed the above 2 patterns.
Added:
From your following reply,
My goal when running this script is that the contents of I6 from the first sheet get sent to the first empty cell in Column I in sheet 2. When I run the first script, to copy I6 from sheet 1 to the first empty cell in Column H (or any other column) in sheet 2 it works perfectly.
If you want to put the value to the 1st empty cell of the column "I", how about the following sample script? In this case, please modify SubmitData02()
as follows.
Sample script:
From:
var freeRow;
var columnI = datasheet.getRange("I2:I" + datasheet.getLastRow()).getDisplayValues().flat();
for(var i = 0; i < columnI.length; i++){
if(columnI[i] == "") {
freeRow = i + 1;
break;
}
}
To:
// Ref: https://stackoverflow.com/a/44563639
Object.prototype.get1stEmptyRowFromTop = function (columnNumber, offsetRow = 1) {
const range = this.getRange(offsetRow, columnNumber, 2);
const values = range.getDisplayValues();
if (values[0][0] && values[1][0]) {
return range.getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow() + 1;
} else if (values[0][0] && !values[1][0]) {
return offsetRow + 1;
}
return offsetRow;
};
var freeRow = datasheet.get1stEmptyRowFromTop(9);
- By this modification,
freeRow
is the 1st empty row.