ОП пытается создать резервную копию данных за предыдущий день на определенном листе, а затем удалить эти данные из источника. Код слишком сложен, не имеет ясности и не удаляет строки из источника.
Последовательность обработки следует методу OP:
- Укажите исходную электронную таблицу и исходную таблицу.
- Создать переменную для определения «вчерашней даты».
- Установить, существует ли лист с таким именем в исходной электронной таблице; если нет, то создайте и переименуйте лист.
- Назначить новый лист как целевой лист
- получить количество строк данных. Обычно можно использовать
getLastRow
, но это идентифицировало пустые фантомные строки.
- получить все данные из таблицы источников до цикла
- цикл по исходным данным
- построить строку заголовка и затем сравнить каждую метку времени с переменной для "вчерашней даты"
- где дата строки совпадает, поместите значения для каждого столбца в «rowarray», поместите массив «row» в «targetarray», очистите «rowarray» для следующей строки; увеличить счетчик строк.
- когда закончите с циклом, обновите целевой лист "targetarray".
- удалить строки из исходного листа.
function so_55537340_03() {
// NOTE: code assumes that data is always in contiguous rows in date order
// setup external sheet
var ss = SpreadsheetApp.openById("<insert spreadsheet ID>");
// Logger.log("DEBUG: ss = "+ss.getName());//DEBUG
var sourceSheet = ss.getSheetByName("Sheet1");
//Logger.log("DEBUG: source sheet: "+sourceSheet.getName());//DEBUG
//get dateString
var today = new Date();
var yesterday = new Date();
yesterday.setDate(today.getDate() - 1);
//Logger.log("DEBUG: yesterday: "+yesterday);//DEBUG
var dateString = Utilities.formatDate(yesterday, 'EDT', 'yyyy-MM-dd');
// Logger.log("DEBUG: datestring: "+dateString);//DEBUG
// create new sheet with yesterdays date
// get the sheet, returns null if not exist
var yourNewSheet = ss.getSheetByName(dateString);
// Logger.log("DEBUG: yournewsheet: "+yourNewSheet);//DEBUG
// test if sheet exists
if (yourNewSheet != null) {
// Logger.log("DEBUG: the spreadsheet is NOT null");//DEBUG
// the sheet exists, so what??
//ss.deleteSheet(yourNewSheet);
} else {
// Logger.log("DEBUG: the spreadsheet is null");//DEBUG
// the sheet doesn't exist, so create and rename the sheet
yourNewSheet = ss.insertSheet();
yourNewSheet.setName(dateString);
}
// assign a variable to the target sheet
var targetSheet = ss.getSheetByName(dateString);
// Logger.log("DEBUG: target sheet: "+targetSheet.getName());// DEBUG
// get the number of rows of data in column A for a loop (getLastrow was unreliable)
var Avals = sourceSheet.getRange("A1:A").getValues();
var Alast = Avals.filter(String).length;
// Logger.log("DEBUG: source last row: "+Alast);//DEBUG
// define the source range and get the data
var sourceRange = sourceSheet.getDataRange();
var sourceData = sourceRange.getValues();
// Logger.log("DEBUG: sourcerange = "+sourceRange.getA1Notation()+", and number of rows of data: "+Alast);//DEBUG
// establish arrays for pasting row results and total results to target sheet
var targetData = [];
var rowData = [];
// create variable to count rows to delete
var rowcounter = 0;
// loop through the source data
for (var i = 0; i < Alast; i++) {
// clear rowData before each new row
rowData = [];
// test for row 1/headers
if (i == 0) {
// build the header row in the target
rowData.push(sourceData[i][0]);
rowData.push(sourceData[i][1]);
rowData.push(sourceData[i][2]);
rowData.push(sourceData[i][3]);
rowData.push(sourceData[i][4]);
rowData.push(sourceData[i][5]);
rowData.push(sourceData[i][6]);
rowData.push(sourceData[i][7]);
// push row data on targetData
targetData.push(rowData);
}
// process for rows other than header
if (i > 0) {
//Logger.log("DEBUG: rowdate: "+sourceData[i][0]);//DEBUG
// get the substring
var sourcecelldate = sourceData[i][0].substring(0, 10);
//Logger.log("DEBUG: data substring: "+sourcecelldate);//DEBUG
// if the data substring equals the datestring for yesterday
if (sourcecelldate == dateString) {
//Logger.log("DEBUG: dates align, do something");//DEBUG
// build the data for the row
rowData.push(sourceData[i][0]);
rowData.push(sourceData[i][1]);
rowData.push(sourceData[i][2]);
rowData.push(sourceData[i][3]);
rowData.push(sourceData[i][4]);
rowData.push(sourceData[i][5]);
rowData.push(sourceData[i][6]);
rowData.push(sourceData[i][7]);
// push row data on targetData
targetData.push(rowData);
rowcounter++
Logger.log("Row counter: " + rowcounter);
} else {
//Logger.log("DEBUG: dates DO NOT align, do nothing");//DEBUG
}
}
} // end of loop
// get number of rows of targetdata
//Logger.log("DEBUG: length of targetdata"+targetData.length);//DEBUG
// define the data range for the target sheet
var targetrows = targetSheet.getRange(1, 1, targetData.length, 8);
// paste the data onto the targetsheet
targetrows.setValues(targetData);
// delete the old rows from the source sheet
//Logger.log("DEBUG: number of rows to delete = "+rowcounter);
sourceSheet.deleteRows(2, rowcounter);
}
Я оставил операторы «Logger» в следующем коде для устранения проблем значений на различных этапах процесса.