Есть ли способ создать таймер при запуске сценария, отсчитывающего до недели?

Итак, по сути, я пытаюсь создать сценарий, который сохраняет вводимые данные и помещает их в другую таблицу. Как только он это сделает, мне нужно создать таймер, который отсчитывает от 0 до недели в зависимости от даты и времени, которые были переданы. Мне было интересно, знает ли кто-нибудь, как это можно сделать, потому что я ничего не нашел в Интернете.

Таблица вводаТаблица вывода Дата и имя будут перенесены в выходную таблицу, и я пытаюсь добиться того, чтобы таймер появился в столбце рядом с ним в этой строке.

Это код, который мне нужен для передачи данных, но мне нечего создавать таймер, и я пытаюсь что-то добавить в этот код для этого.

function saveTax() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var taxForm = ss.getSheetByName('Tax Form');

  var lastRow = taxForm.getLastRow();
  var targetRow = lastRow + 1;

  if (taxForm.getRange('C7').isBlank()){

    taxForm.getRange('C7').setBackground('#ff0000');
    throw new Error('Required Cell is Missing Info. '); 
  }

  else {

    var valuesToCopy = taxForm.getRange('B7').getValues();
    taxForm.getRange(targetRow, 2, 1, valuesToCopy.length).setValues([valuesToCopy.flat()]);

    var valuesToCopy = taxForm.getRange('C7').getValues();
    taxForm.getRange(targetRow, 3, 1, valuesToCopy.length).setValues([valuesToCopy.flat()]);

    taxForm.getRange('C7').setBackground('#ffffff');
  }
}

Я должен извиниться за мое плохое знание английского языка. К сожалению, я не могу понять a timer that counts from 0 to a week based off the date and time that was transferred across. Могу ли я спросить вас о деталях? Во-первых, мне хотелось бы правильно понять Ваш вопрос.

Tanaike 13.06.2024 07:23

Да, конечно. Я имею в виду таймер, который сообщает зрителю, сколько времени прошло с момента ввода данных, поэтому, если бы я сделал это час назад, таймер показал бы 1:00:00, что соответствует часу. То же самое с секундами, минутами, днями и т. д. И я хочу, чтобы это закончилось, когда пройдет 1 неделя. Надеюсь, это более понятно, если нет, просто сообщите мне.

Narukami 13.06.2024 07:55

Спасибо за ответ. К сожалению, я не могу понять And I want it to end once it reaches 1 week. А по поводу if i made it an hour ago the timer would say 1:00:00 и 1 week, когда разница составляет 3 дня, какое значение вам нужно?

Tanaike 13.06.2024 08:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если я правильно понял, вам нужно обновить столбец листа под названием таймер, указав время, проведенное с определенной даты, которая берется из другого столбца, верно? В этом случае вы можете создать собственную формулу App Script для ячейки и постоянно обновлять ее, вот пример:

function getTimeSince(dateCell) {
  // Get the date from the cell
  const dateTime = new Date(Date.parse(dateCell));

  // Check if the date is valid
  if (!dateTime || !(dateTime instanceof Date)) {
    return "Invalid Date";
  }

  // Calculate the time difference in milliseconds
  const now = new Date();
  const diff = now.getTime() - dateTime.getTime();

  // Limit the difference to one week (7 days)
  const limitedDiff = Math.min(diff, 7 * 24 * 60 * 60 * 1000);

  // Calculate days, hours, minutes, and seconds
  const days = Math.floor(limitedDiff / (1000 * 60 * 60 * 24));
  const hours = Math.floor((limitedDiff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  const minutes = Math.floor((limitedDiff % (1000 * 60 * 60)) / (1000 * 60));
  const seconds = Math.floor((limitedDiff % (1000 * 60)) / 1000);

  // Format the time string with leading zeros
  const formattedDays = days.toString().padStart(2, '0');
  const formattedHours = hours.toString().padStart(2, '0');
  const formattedMinutes = minutes.toString().padStart(2, '0');
  const formattedSeconds = seconds.toString().padStart(2, '0');

  // Return the formatted string (x days hours:minutes:seconds)
  return `${formattedDays} days ${formattedHours}:${formattedMinutes}:${formattedSeconds}`;
}

function createTriggerEvent() {
  // Create a trigger to clear all data from reports at final of month
  ScriptApp.newTrigger('getTimeSince')
           .timeBased()
           .everyMinutes(5) // You can control the interval here
           .create();
}

Затем вам нужно будет один раз запустить редактор createTriggerEvent() в App Script, чтобы создать триггер. После того, как вы сможете перейти к ячейке и поместить новую формулу =getTimeSince(A1), теперь он будет обновлять столбец с затраченным временем до недели и обновлять каждый x минут.

Решит ли это вашу проблему?

Я только что попробовал это, там написано, что dateCell.getValue() из строки 3 не является функцией, поэтому возникает ошибка. Есть ли что-то, что мне не хватает? Кроме того, случайно не знаете ли вы другой способ создать сценарий сохранения, который помещает информацию в эту таблицу, игнорируя ячейку таймера для следующей строки?

Narukami 10.07.2024 04:55

@Наруками, извини, это была моя ошибка, я обновляю ответ, повтори попытку.

dfop02 10.07.2024 19:14

Вы можете использовать PropertiesService для сохранения значения следующей даты в saveTax, проверки текущей даты и запуска saveTax, если сегодняшняя дата valueOf() больше сохраненной даты. Затем просто обновите дату в PropertiesService на следующую дату.

Что-то вроде этого:

function saveTax(e) {
  const tjs = PropertiesService.getScriptProperties().getProperty("saveTax");
  let dt = new Date();
  if (tjs) {
    let tObj = JSON.parse(tjs);
    let tdt = new Date(tObj.yyyy, tObj.mm, tObj.dd);
    let tdv = tdt.valueOf();
    
    let dtv = new Date(dt.getFullYear(), dt.getMonth(), dt.getDate()).valueOf();
    if (tdv >= dtv) {
      let ss = SpreadsheetApp.getActive();
      let sh = ss.getSheetByName('Tax Form');
      let tr = sh.getLastRow() + 1;
      if (sh.getRange('C7').isBlank()) {
        sh.getRange('C7').setBackground('#ff0000');
        throw new Error('Required Cell is Missing Info. ');
      } else {
        sh.getRange(tr, 2, 1, 2).setValue([[sh.getRange('B7').getValue(), sh.getRange('C7').getValue()]]);
        sh.getRange('C7').setBackground('#ffffff');
      }
      let ndt = new Date(dt.getFullYear(),dt.getMonth(),dt.getDate() + 7);
      PropertiesService.getScriptProperties().setProperty("saveTax",JSON.stringify({yyyy:ndt.getFullYear(),mm:ndt.getMonth(),dd:ndt.getDate()}));
    }
  } else {
    let ndt = new Date(dt.getFullYear(),dt.getMonth(),dt.getDate() + 7);  
    PropertiesService.getScriptProperties().setProperty("saveTax",JSON.stringify({yyyy:ndt.getFullYear(),mm:ndt.getMonth(),dd:ndt.getDate()}));
  }
}

Другие вопросы по теме