我正在尝试将昨天的数据从一张纸上移到另一张纸上(从底部的一个标签移动到底部的另一个标签),然后从第一张纸上删除它(同时保留方程式)。
我有一个Google脚本每天晚上午夜后运行,并且我尝试遍历每一行,检查第一列是否具有昨天的日期,然后将该行复制到另一张工作表并删除原始行。
function moveDataNewSheet() {
var DATA_SPREADSHEET_ID = "16cy4ClKYEN_w5_c6KiR2zSjRsUD9ijxQD9DGffNRXtI";
var Sheet1 = SpreadsheetApp.openById(DATA_SPREADSHEET_ID).getSheetByName("Sheet1");
// create sheet with yesterdays date
// if col1 has yesterdays date,
// then copy it to yesterdays sheet
// delete row
//get dateString
var today = new Date();
var yesterday = new Date();
yesterday.setDate(today.getDate()-1);
var dateString = Utilities.formatDate(yesterday, 'EDT', 'yyyy-MM-dd');
// create new sheet with yesterdays date
var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var yourNewSheet = activeSpreadsheet.getSheetByName(dateString);
if (yourNewSheet != null) {
activeSpreadsheet.deleteSheet(yourNewSheet);
}
yourNewSheet = activeSpreadsheet.insertSheet();
yourNewSheet.setName(dateString);
//set active sheet to Sheet1
SpreadsheetApp.setActiveSheet(Sheet1);
SpreadsheetApp.getActiveSpreadsheet().moveActiveSheet(1);
// if col1 has yesterdays date copy it to dateString's sheet
// delete row
var ss = SpreadsheetApp.getActiveSpreadsheet();
var source_sheet = SpreadsheetApp.getActiveSpreadsheet();
var target_sheet = activeSpreadsheet.getSheetByName(dateString);
for (var i = 0; i < Sheet1.getLastRow(); i++) {
if (Sheet1.getRange(i,1).getValue() == Sheet1.getRange(i,1).substring(0,10)) {
var last_row = target_sheet.getLastRow();
target_sheet.insertRowAfter(last_row);
source_sheet.getRange(i,1).clear();
}
}
答案 0 :(得分:0)
OP尝试将前一天的数据备份到特定的工作表,然后从源中删除该数据。该代码过于复杂,缺乏清晰性,并且无法从源代码中删除行。
处理顺序遵循OP的方法:
getLastRow
,但这标识了空的“幻像”行。 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”语句,以便对过程中各个阶段的值进行故障排除。