【问题标题】:Macro Google Sheet "Macro action change"宏 Google 工作表“宏动作更改”
【发布时间】:2021-11-29 12:19:32
【问题描述】:

我需要改变这个宏的工作方式

function getDynamicRow(){

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('B.Wioski');
  var sourceRange = sheet.getRange('A1:F26500');
  var data = sourceRange.getValues(); // Array of arrays [[Row1],[Row1],[Row3]]

  // add data to next empty row in the static sheet. 
  var targetSheet = ss.getSheetByName('TW');
  targetSheet.getRange(targetSheet.getLastRow() + 1, 1, data.length, data[0].length).setValues(data);
}

目前宏将条目放在另一个下面,我需要它来将条目放在下面预览图像的右侧

另外,我需要一个宏来删除超过 5-7 天的数据

【问题讨论】:

  • 请提供您示例中的数据是一个表格,以便我们可以复制和粘贴它。您需要的解决方案非常简单,除了删除超过 5 天的数据,因为数据中没有时间戳。您希望将时间戳放在哪里。
  • 我想插入一个函数 =IF(J2"";IF(J1="";TODAY();J1);"")
  • 最好把这个日期放在第一行

标签: google-apps-script google-sheets google-sheets-api


【解决方案1】:

建议

也许您可以尝试以下实现:

脚本:

function getDynamicRow(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('B.Wioski');
  var sourceRange = sheet.getRange('A1:F'+sheet.getLastRow());
  var data = sourceRange.getValues(); // Array of arrays [[Row1],[Row1],[Row3]]
  data.push(["","","","","",new Date()]); //added a timestamp for reference on deleting older data

  // add data to next empty row in the static sheet. 
  var targetSheet = ss.getSheetByName('TW');
  var currentCol = targetSheet.getDataRange().getNumColumns();
  if(currentCol != 1)currentCol = currentCol+1;
  targetSheet.getRange(1, currentCol, data.length, data[0].length).setValues(data);
}

示例结果:

脚本运行一次后:

再次运行后(以此类推):

至于删除超过 5 - 7 天的数据,这是我的实现,您可以尝试:

由于我在工作表TW 上的每个复制数据上都添加了时间戳,因此您可以参考以下示例脚本:

更新

脚本:

function deleteOlderThan5To7Days(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var targetSheet = ss.getSheetByName('TW');
  var row = targetSheet.getDataRange().getLastRow();
  var col = targetSheet.getDataRange().getLastColumn();
  var data = targetSheet.getRange(row,1,1,col).getValues();

  for(x=0; x< data[0].length; x++){
    var curCol = x + 1;
    if(data[0][x] != ""){
      var getDate = Utilities.formatDate(new Date(data[0][x]), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "dd");
      var checkDays = getDate - new Date().getDate();
      if(new Date(data[0][x]).getMonth()+1 == new Date().getMonth()+1){ //If data timestamp is within the current month
          if(checkDays > 5){ //Check if the timestamp of the data is more than 5 - 7 days
            Logger.log("Current row date: "+data[0][x]+"\n"+"Found on column #"+curCol+ " is "+checkDays+" days older");
            Logger.log("Delete data column " + curCol);
            targetSheet.insertColumnsAfter(targetSheet.getLastColumn(),1); //add a blank column on every deletion
            targetSheet.deleteColumn(curCol); //delete the points column data
            return;
          }else{
            //Data timestamp is NOT older than 5-7 days");
          }
      }else{ //Data was copied last month or older that the current month
        Logger.log("Current row date: "+data[0][x]+"\n"+"Found on column #"+curCol+ " is old");
        Logger.log("Delete data column "+ curCol);
        targetSheet.insertColumnsAfter(targetSheet.getLastColumn(),1); //add a blank column on every deletion
        targetSheet.deleteColumn(curCol); //delete the points column data
        return;
      }
    }
  }
}

示例演示:

假设第一个数据是在 2021 年 11 月 2 日或11/2/2021 复制的,如TW 的样本表中所示:

运行示例函数deleteOlderThan5To7Days后,结果如下:

审核的执行日志:

注意:

如果月份与当前月份相同但早于 5-7 天,则适用相同的删除过程。

【讨论】:

  • 谢谢,这是一个很棒的代码
  • 我根据自己的需要对其进行了修改,但我需要帮助现在需要前 5 列不可从列 F 中移除,要移除您可以重写代码以仅移除日期列吗?跨度>
  • 感谢您的回复。关于您需要不可移动的前 5 列,我还不清楚。澄清一下,您的意思是您只想删除时间戳日期早于 5-7 天的列 Points,对吗?
  • 是的,我只对积分栏感兴趣。 LP 列、村庄名称、X 位置、Y 位置和玩家 ID 不可变
  • 我已经在我的回答中更新了 deleteOlderThan5To7Days 的脚本,只删除时间戳日期早于 5-7 天的 Points
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多