如果有人可以提供帮助,需要一些新的眼睛。这是最终目标 使用名为MASTER的工作表生成电子表格 Spreadhsheet Archive_Production与名为ARCHMASTER的工作表 需要使用字符串来表示“星期二,11月25日”的日期格式,所以需要以某种方式转换为字符串。 我的目标是,如果MASTER列O中包含“100%”字符串,并且列B的日期比今天的日期早XXX天,则将整行移动到ARCHMASTER。 我已经知道,至少在我的实现中,我无法让下面的代码工作。这也没有使用日期转换为字符串。我知道这可能会产生很多开销,但是为了用户的可读性,使用上面提到的日期格式很重要。有人可以帮忙吗?至少可以说,我是脚本文盲,你可以告诉
function onOpen() {
// Next4 lines were suggested in another post.
//var production_sheet_id = '1goG0TS1_2jwlGRetREYNRVk-Q6TEy3iWG_5VXFoZlus'; // This is my source sheet
//var archived_sheet_id = '1Mr4LJmp1SmpDs1i8U_PE5uLOEVjLc599Vq87m9HwCx0'; // This is my destination sheet
// var sheet1 = SpreadsheetApp.openById(production_sheet_id).getSheets()[0];
//var sheet2 = SpreadsheetApp.openById(archived_sheet_id).getSheets()[0];
var sheet1 = SpreadsheetApp.openById('1goG0TS1_2jwlGRetREYNRVk-Q6TEy3iWG_5VXFoZlus')
.getSheetByName('MASTER');
var Sheet2 = SpreadsheetApp.openById('1Mr4LJmp1SmpDs1i8U_PE5uLOEVjLc599Vq87m9HwCx0')
.getSheetByName('ARCHMASTER');
var rows = sheet1.getDataRange();
var numRows = rows.getNumRows();
var values = rows.getValues();
for (var i = 0; i < numRows; i++) {
var oldDate = values[i][1];
var curDate = new Date();
// Count time difference in milliseconds, convert them into days then.
var diffInMilliSecs = (curDate.getTime() - oldDate.getTime());
var diffInDays = diffInMilliSecs/1000/60/60/24;
var diffInDays = Math.round(diffInDays);
if(values[i][14] == 1.0 && Math.abs(diffInDays+30) >= 7) // It evaluates 100% to 1.0
sheet2.appendRow(values[i]);
} }
答案 0 :(得分:0)
您在评论中提到调用getTime()时会出现引用错误。
&#34; oldDate&#34;的价值很可能你得到的不是Date对象,因此没有getTime()函数。如果要使用getTime,则需要将其转换为Date对象。你可以试试
var oldDate = new Date(values[i][1]);
如果值是Javascript理解的日期字符串,它将起作用。但是,如果日期值是用户手动输入的内容,则由于输入错误,这将永远不可靠。
我建议把
Logger.log(values[i][1]);
直接位于您的&#34; var oldDate ...&#34;线。运行脚本后,选择&#34; Logs&#34;来自&#34; View&#34;脚本编辑器中的菜单,用于查看您尝试处理的值作为日期。
这应该可以帮助您弄清楚您的约会发生了什么。一旦你确定日期数学部分,继续写入工作表,然后最终专注于根据需要格式化日期。
要处理删除已移动的行,请尝试以下操作:
...existing code here...
var rows_to_keep = [];
for (var i = 0; i < numRows; i++) {
... existing code here ...
if(values[i][14] == 1.0 && Math.abs(diffInDays) >= 7){
sheet2.appendRow(values[i]);
}else{
//did not match
rows_to_keep.push(values[i]);
}
}//end of for loop
sheet1.clear();
sheet1.getRange(1,1,rows_to_keep.length,rows_to_keep[0].length).setValues(rows_to_keep);
更简单但可能更加资源密集/更慢的方法是在追加每行时删除它们,如下所示:
...existing code here...
if(values[i][14] == 1.0 && Math.abs(diffInDays) >= 7){
sheet2.appendRow(values[i]);
sheet1.deleteRow((i+1)); //+1 because Sheets starts counting at 1, while Arrays start at 0.
}
有关clear()的替代方法,请参阅此处与工作表相关的函数: https://developers.google.com/apps-script/reference/spreadsheet/sheet