Страницы: 1
RSS
Штамп даты в Таблицах Гугл (Google Sheets), автоматическая вставка даты в определенную ячейку при редактировании определенной ячейки
 
Всем привет.
...задача была в Гугл таблицах (Google Sheets) в автоматическом режиме вставлять сегодняшнюю дату(дату редактирования) в определённую ячейку при редактировании определенной ячейки.
В поисках сего наткнулся на такой код:
Код
function auto_set_date(){
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName('ЗАЯВКИ');


let ar = sheet.getActiveRange();

let a_col = ar.getColumn();
// let a_row = ar.getRow();

if(a_col === 2 && ar.offset(0,6).getValue()===''){
ar.offset(0,6).setValue(new Date());  
}
}

Код работает....но абсолютно на всех листах... а надо только на одном.

В поисках решения проблемы наткнулся на такой код:
Код
if (sheet.getName()==="Нужный лист"){весь код} 
пояснение куда вставить этот кусок кода отсутствовало и я так понял, что надо вставить этот кусок кода строкой №1 и в скобках "весь код" вписать весь код начиная со строки "function auto_set_date(){".
То есть вот так:
Код
if (sheet.getName()==='ЗАЯВКИ'){
function auto_set_date(){
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName('ЗАЯВКИ');


let ar = sheet.getActiveRange();

let a_col = ar.getColumn();
// let a_row = ar.getRow();

if(a_col === 2 && ar.offset(0,6).getValue()===''){
ar.offset(0,6).setValue(new Date());  
}
}
}

Ну я так и сделал... и при таком раскладе код полностью перестал работать.

Кто знает как решить эту проблему - как заставить этот код работать только на определённом листе?
Изменено: Данил И - 28.01.2023 14:09:03
 
Как минимум нужно понимание, что со слов function начинается сама выполняемая функция и все, что до неё или после - это что-то за пределами и к ней отношения не имеет. Значит все условия должны быть ВНУТРИ функции:

Код
function auto_set_date(){
if (sheet.getName()==='ЗАЯВКИ'){
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName('ЗАЯВКИ');
 
 
let ar = sheet.getActiveRange();
 
let a_col = ar.getColumn();
// let a_row = ar.getRow();
 
if(a_col === 2 && ar.offset(0,6).getValue()===''){
ar.offset(0,6).setValue(new Date());  
}
}
}
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
спасибо.
но в таком виде код тоже не работает - штамп даты не проставляется даже там где нужно  :(  
 
ну да - написать написал, но в суть функции не вдавался. Вы, судя по всему - тоже :) А логику никто не отменял - сразу же первой строкой смысла нет, т.к. у переменной sheet нет значения. Вот так будет работать(если все остальное работало ранее, конечно):
Код
function auto_set_date(){
let ss = SpreadsheetApp.getActiveSpreadsheet();
if (ss.getName()==='ЗАЯВКИ'){
let sheet = ss.getSheetByName('ЗАЯВКИ'); //фигня, конечно - т.к. мы и так уже определили, что это лист заявки
let ar = sheet.getActiveRange();
  
let a_col = ar.getColumn();
// let a_row = ar.getRow();
  
if(a_col === 2 && ar.offset(0,6).getValue()===''){
ar.offset(0,6).setValue(new Date());  
}
}
}

поэтому(основываясь на комментрии к строке с getSheetByName)), я бы написал код так:
Код
function auto_set_date(){
let sheet = SpreadsheetApp.getActiveSpreadsheet();
if (sheet.getName()==='ЗАЯВКИ'){
let ar = sheet.getActiveRange();
  
let a_col = ar.getColumn();
// let a_row = ar.getRow();
  
if(a_col === 2 && ar.offset(0,6).getValue()===''){
ar.offset(0,6).setValue(new Date());  
}
}
}
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
не поверите   :D  этот способ тоже не работает :D  

я конечно особо не разбираюсь в таком коде, но всё таки логически предположил, что если "не работает", то скорее всего код не находит лист с нужным названием...?

...так как код в изначальном виде работает, но на всех листах сразу...
то есть код наверно не находит лист с нужным названием даже не смотря на то, что содержит указание на каком листе ему работать:
Код
let sheet = ss.getSheetByName('ЗАЯВКИ');
Как-то так что ли... не знаю...
 
Цитата
Данил И написал:
не знаю...
мы тем более. Может лист вообще иначе называется(пробелы там какие-либо в начале или в конце). Как Вы написали - вполне логично, если без проверки на имя листа работает, а с проверкой нет - дело в имени листа.
Еще хотел спросить - зачем три знака равенства? Вам нужна обязательная типизация данных? Может использовать более универсальную проверку с двумя? И лучше использовать кавычки для определения текста - вроде Google так вполне нормально воспринимает данные.
И возможно, имеет смысл хоть какую-то визуальную проверку сделать на то, какое имя листа выводится:
Код
function auto_set_date(){
let sheet = SpreadsheetApp.getActiveSpreadsheet();
SpreadsheetApp.getUi().alert(sheet.getName());
if (sheet.getName() == "ЗАЯВКИ"){
let ar = sheet.getActiveRange();
   
let a_col = ar.getColumn();
if(a_col == 2 && ar.offset(0,6).getValue() == ""){
ar.offset(0,6).setValue(new Date());  
}
}
}

теперь при любом изменении должно показываться сообщение с именем листа. Так хоть поймете - реально ли работает и что там с именем листа. Потому что сидеть и гадать по одному голому коду лично я смысла не вижу.
Изменено: Дмитрий(The_Prist) Щербаков - 30.01.2023 09:01:57
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
написал:
Еще хотел спросить - зачем три знака равенства?
ну как бы не знаю. взял код с видео урока на ютубе. там автор именно так и писал код. но там не стаяла задача выполнять код на конкретном листе. это потом уже пользователи в комментариях под видео просили поделиться советом как выполнять этот код на конкретном листе(листах). но автор особо не отвечает на этот вопрос.

Цитата
написал:
И возможно, имеет смысл хоть какую-то визуальную проверку сделать на то, какое имя листа выводится:
Цитата
написал:
теперь при любом изменении должно показываться сообщение с именем листа
в сообщении выводится имя КНИГИ, а не листа и код опять не работает.

PS
Да, и на наличие пробелов тоже проверял - в названии листов и книги пробелов нет ни спереди ни сзади.
Изменено: Данил И - 30.01.2023 11:11:37
 
Цитата
Данил И написал:
в сообщении выводится имя КНИГИ
вот и ответ - взяли где-то код, который выдает не то, что хотели. Странно, что после этого не получилось достучаться до получения активного листа - думаю это гуглится без проблем. Не самая сложная операция - получить лист:
Код
function auto_set_date(){
var sheet = SpreadsheetApp.getActiveSheet(); 
if (sheet.getName() == "ЗАЯВКИ"){
var ar = sheet.getActiveRange();
var a_col = ar.getColumn();
if(a_col == 2 && ar.offset(0,6).getValue() == ""){
ar.offset(0,6).setValue(new Date());  
}
}
}


P.S. Если бы выложили ссылку на документ, вместо кодов - ответ получили бы давно :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
РЕШЕНО!

СПАСИБО !!!  :D  Всё работает. Штамп даты проставляет на нужном листе.

Код
function auto_set_date(){
var sheet = SpreadsheetApp.getActiveSheet(); 
if (sheet.getName() == "ЗАЯВКИ"){
var ar = sheet.getActiveRange();
var a_col = ar.getColumn();
if(a_col == 2 && ar.offset(0,6).getValue() == ""){
ar.offset(0,6).setValue(new Date());  
}
}
}
 
А как правильно перечислить листы, на которых должен работать скрипт?
Нужно чтобы на одних листах даты проставлялись, а на других нет
Страницы: 1
Читают тему
Наверх