将行移动到完全其他电子表格 - 将日期转换为字符串

时间:2014-11-25 20:20:49

标签: google-apps-script google-sheets

如果有人可以提供帮助,需要一些新的眼睛。这是最终目标 使用名为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]);

} }

1 个答案:

答案 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