Итак, по сути, я пытаюсь создать сценарий, который сохраняет вводимые данные и помещает их в другую таблицу. Как только он это сделает, мне нужно создать таймер, который отсчитывает от 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');
}
}
Да, конечно. Я имею в виду таймер, который сообщает зрителю, сколько времени прошло с момента ввода данных, поэтому, если бы я сделал это час назад, таймер показал бы 1:00:00, что соответствует часу. То же самое с секундами, минутами, днями и т. д. И я хочу, чтобы это закончилось, когда пройдет 1 неделя. Надеюсь, это более понятно, если нет, просто сообщите мне.
Спасибо за ответ. К сожалению, я не могу понять 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 дня, какое значение вам нужно?





Если я правильно понял, вам нужно обновить столбец листа под названием таймер, указав время, проведенное с определенной даты, которая берется из другого столбца, верно? В этом случае вы можете создать собственную формулу 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 не является функцией, поэтому возникает ошибка. Есть ли что-то, что мне не хватает? Кроме того, случайно не знаете ли вы другой способ создать сценарий сохранения, который помещает информацию в эту таблицу, игнорируя ячейку таймера для следующей строки?
@Наруками, извини, это была моя ошибка, я обновляю ответ, повтори попытку.
Вы можете использовать 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()}));
}
}
Я должен извиниться за мое плохое знание английского языка. К сожалению, я не могу понять
a timer that counts from 0 to a week based off the date and time that was transferred across. Могу ли я спросить вас о деталях? Во-первых, мне хотелось бы правильно понять Ваш вопрос.