【问题标题】:Same message repeating 3 times同一条消息重复 3 次
【发布时间】:2015-08-27 18:47:48
【问题描述】:

我有下面的代码,它采用第一列并根据日期将其打印在谷歌文档中。不幸的是,这会重复并打印该行三次。

function saveAsDOC() {
  var fileName = "Announcements Test File";
  var doc = DocumentApp.create(fileName);

  // Get the range in the spreadsheet
  var ws = SpreadsheetApp.getActiveSpreadsheet().getDataRange();
  try {
    var data = ws.getValues();

    // Announcements loop
    if (data.length > 1) { // Make sure data is longer than one character
      for (var row = 1; row < data.length; row++) {
        if(new Date(data[row][2]) <= new Date()) { // Check the date
          for (var col = 1; col < data[row].length; col++) {
            if(data[row][col]!=""){ // Make sure the data is not empty
              doc.appendParagraph(data[row][1]); // Append announcement
              doc.appendParagraph("") // Line break between announcements
            }
          }
        }
      }
    }
   }

  catch(err) {
    Logger.log(err);
    Browser.msgBox(err);
  }
}

源数据位于 Google 电子表格中,包含“公告”、“开始日期”和“结束日期”三列。我想为“今天”编制一份公告列表(即今天的日期介于开始日期和结束日期之间,含)。

                A                     B             C
1 | Announcement               | Start date  | End date    |
2 | You SHOULD see this.       | 1 Jan 2015  | 31 Dec 2015 |
3 | You SHOULD NOT see this.   | 1 Jan 2015  | 1 Jan 2015  |
4 | You SHOULD ALSO see this.  | 1 Jan 2015  | 31 Dec 2015 |
5 | You SHOULD NOT see this.   | 31 Dec 2015 | 31 Dec 2015 |

这是我的输出示例:

我的代码跳过了不应该看到的公告,这很好。但它会多次打印预期的公告。我该如何解决?

【问题讨论】:

  • 您的问题不清楚,您需要edit 提供更多信息,并将代码缩减为minimal reproducible example。你的数据是什么样的? (产生您的问题的示例会有所帮助。)创建文档与您面临的问题无关,将其取出,并使用更简单的方法来跟踪内部循环的执行,例如日志。同样,不需要任何 UI 部分 (toast)。如果您使 核心 问题易于重现,您将获得更好的答案......并且可能自己解决!
  • 我已经更新了我的帖子。我很清楚如何发布问题,不幸的是我一直这样做却没有得到任何答案。
  • 试试这个。选择电子表格中的任何行,该行具有当前在文档中显示 3 次的公告。在行的末尾添加另一个单元格,其中包含任何内容。然后运行脚本。您现在应该会看到该公告的 4 份副本。
  • 我已经这样做了,它打印了 4 份。我假设行 for (var row = 1; row &lt; data.length; row++) { 与它有关?
  • 部分,是的 - 循环遍历行中的所有单元格。结合检查单元格是否为空的比较,您最终将为每个非空单元格打印 something 。而且那东西总是相同的东西,因为你附加了data[row][1]

标签: javascript google-apps-script google-sheets google-docs


【解决方案1】:

这是演示问题的代码的最小版本,添加了 cmets 来解释正在发生的事情:

function announcements() {
  // Get the range in the spreadsheet
  var ws = SpreadsheetApp.getActiveSpreadsheet().getDataRange();
  var data = ws.getValues();
  var results = [];

  if (data.length > 1) {                                    // Make sure data is longer than one ROW (not character)
    for (var row = 1; row < data.length; row++) {           // Skips first row, then loop over the rest is that what you want?
      if(new Date(data[row][2]) <= new Date()) {            // Check the date, [2] is the third column.
        for (var col = 1; col < data[row].length; col++) {  // Loop over all columns except the first one
          if(data[row][col]!=""){                           // Make sure the data is not empty
            results.push(data[row][1]);                     // Append [row][1]; **** Same value
          }
        }
      }
    }
  }

  Logger.log( JSON.stringify( results ) );
}

这里有几个可能的问题:

  • if (data.length &gt; 1) 会检查您是否有超过一 的数据,这与您的评论不匹配。确保这是您想要做的。
  • for (var row = 1; etc. 循环遍历所有行,但跳过第一行。也许这就是您想要的,但是人们遇到的一个常见问题是,当您使用 Google 的电子表格方法时,电子表格的行(和列)从 1 开始编号,但在 JavaScript 数组中从 0 开始编号。 data的内容是一个JavaScript数组,所以它是从0开始的。(在chat讨论过,明白了,所以没有问题。)
  • if(new Date(data[row][2]) &lt;= new Date()) 仅检查“结束日期”是否为截至今天的日期。您还需要检查“开始日期”。 (在聊天中讨论。)
  • for (var col = 1; col &lt; data[row].length; col++) 循环遍历所有列(在每一行中)。然后if(data[row][col]!="") 检查该单元格是否为非空白,results.push(data[row][1]) 附加“公告”。 这就是为什么您会看到重复的公告。根据您的问题陈述,无需遍历行,您只需检查每一行是否有公告。

更新代码

function announcements() {
  // Get the range in the spreadsheet
  var ws = SpreadsheetApp.getActiveSpreadsheet().getDataRange();
  var data = ws.getValues();
  
  var announcementCol = 1,    // "constants" for column numbers
      dateCol = 2;
  var results = [];           // Array to hold announcements for today

  if (data.length > 1) {
    // Loop over rows that contain announcements
    for (var row = 1; row < data.length; row++) {
      // Check that today is a date that the announcement should be included.
      if(new Date(data[row][1]) <= new Date() && new Date(data[row][2]) >= new Date() ) {
        // Is there an announcement in this row?
        if(data[row][announcementCol]!=""){
          // Add this announcement to results
          results.push(data[row][announcementCol]);
        }
      }
    }
  }
  
  // Show results in log
  Logger.log( JSON.stringify( results ) );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 2018-04-17
    相关资源
    最近更新 更多