Javascript 如果存在巧合,如何查看范围并在单元格中设置值

Javascript 如果存在巧合,如何查看范围并在单元格中设置值,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我正在尝试创建一个函数,通过一个提示符,从用户设置的数据中设置电子表格单元格中的一些内容 有些部件工作正常,有些问题 在上下文中,我们有一个日历如下的电子表格:a:a范围中的每个单元格都是学年的一天,从A1的9月1日开始,A2的9月2日开始,依此类推。在B栏中,我们现在有假期、假期和其他。在一个学年中有许多稳定的日子,例如圣诞节:每年都是同一天,月份每年都会变化。除此之外,几乎在西班牙的每所学校都有几天选择休息一下 首先,我们设置函数,输入要比较的范围A列,输出要写入新内容的范围B列。var y

我正在尝试创建一个函数,通过一个提示符,从用户设置的数据中设置电子表格单元格中的一些内容

有些部件工作正常,有些问题

在上下文中,我们有一个日历如下的电子表格:a:a范围中的每个单元格都是学年的一天,从A1的9月1日开始,A2的9月2日开始,依此类推。在B栏中,我们现在有假期、假期和其他。在一个学年中有许多稳定的日子,例如圣诞节:每年都是同一天,月份每年都会变化。除此之外,几乎在西班牙的每所学校都有几天选择休息一下

首先,我们设置函数,输入要比较的范围A列,输出要写入新内容的范围B列。var year作为函数的参数给出,但在此处设置用于测试

function setSpecialHolidays() {
  var year = 2017;
我必须为这个数据创建一个parseInt,因为当作为参数提供时,会将其检测为字符串,因此无法正常工作。但是现在可以了

  var yearNumber = parseInt(year);
  var sheet = SpreadsheetApp.getActive().getSheetByName("Calendar"+year);
  var inputRange = sheet.getRange('A1:A'+sheet.getLastRow()).getValues();
  var outputRange = sheet.getRange('B1:B'+sheet.getLastRow());
这里开始一个循环,我们可以输入不同的日期。每天我都在提示符中设置脚本,脚本必须在和列的日期和内容相对应的单元格中设置它

我在循环之前设置了这个ButtonSet,因为我需要它来启动while,因为它在用户单击No按钮之前仍将工作

  var specialHoliday = ui.alert('Click «Yes» to set a special holidays', ui.ButtonSet.YES_NO); 
  while (specialHoliday == ui.Button.YES) {
    var dayPointer = ui.prompt('Please enter the special holiday date (DD/MM)');
    var specialHolidayDate = dayPointer.getResponseText();
    var specialHolidayDateParts = specialHolidayDate.split("/");
    var date = new Date();
    date.setMonth(specialHolidayDateParts[1] - 1, specialHolidayDateParts[0]);
    date.setHours(0, 0, 0, 0);
由于学年包括两个不同的自然年,为了便于日期比较,我们需要确保如果月份是从9月到12月,则为本年,如果月份是从1月到7月,则为*本年+1,这是下一年。正因为如此,我把这个条件化了。这也很有效。我已经做了一些测试和ui.alert,以确保在今年或明年检测良好

    if (specialHolidayDateParts[1] <= 8) {
      date.setYear(yearNumber + 1);
    } else if (specialHolidayDateParts[1] > 8) {
      date.setYear(yearNumber);
    }
好的,提前感谢您的帮助。

代表OP发布

我做了一些尝试,最后我找到了正确的方法来做我想做的事情,在一个单元格中设置一个值,旁边是一个单元格,该单元格的日期与用户输入的日期进行了比较。声明中有一个错误:

在某个范围内,我无法设置值,但我正在尝试。。。 需要使用.getTime方法来比较日期值 这是我想的答案!已更正for循环的代码:


我终于理解了outputRange中的问题:作为一个范围,我不能设置值,因为它不是一个单元格,然后,我必须按原样分配值。我不确定的是为什么每次比较值后都需要.getTime。但它是有效的

那怎么办?完全不起作用?在我看来,它似乎是有效的。它只是效率低下,你只是想优化它吗?@RobinGertenbach,在脚本必须设置输出数据的地方不起作用。我认为数组有问题,但我不知道如何确保它。您将比较日期对象作为设置值的测试。如果希望日期/时间精确匹配,甚至匹配到毫秒,则应比较两个日期的毫秒数。如果您只想匹配一年中的某一天,那么您应该得到每个日期的年份和日期并进行比较。如果您想要精确匹配,那么您可能应该在两个日期对象上使用now,然后将毫秒与毫秒进行比较。@SandyGood,我已经确保日期对象是相同的,事件与毫秒。通过将setHours0、0、0、0放在输入日期上,我得到了相同的值。我通过不同的ui.alert消息看到了这一点。然后,比较和评估是正常的,麻烦在于将结果放入for循环中。我不知道是否是一个写作的麻烦,数组或其他我认为没有在脑海中。感谢您的评论和帮助!你应该回答你自己的问题。否则,此问题将显示为未回答。对于任何有相同问题的人来说,当他们搜索帖子时,他们可能会寻找有答案的帖子。请考虑你的职位将来如何帮助他人。
    for (var i = 0; i < inputRange.length; i++) {
      var dateCompare = new Date(inputRange[i][0]);
      if (dateCompare == date) {
        outputRange[i][0].setValue("Holiday: special holiday");
      }
    }
    var specialHoliday = ui.alert('Do you want to set a new special holiday?', ui.ButtonSet.YES_NO);
  }
    for (var i = 0; i < inputRange.length; i++) {
      var dateCompare = new Date(inputRange[i][0]);
      if (dateCompare.getTime() == date.getTime()) {
        outputRange[i][0] = "Holiday: special holiday";
      }
    }