Новости:

Интересные и полезные статьи по работе с Excel и VBA
можно найти в разделе ХИТРОСТИ

Главное меню

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.

Просмотр сообщений

Сообщения - casag

#1
Попробуйте так: в окне "Проверка данных" выберите в выпадающем списке: "Пользовательская формула" и введите формулу =NOT(REGEXMATCH(TO_TEXT(B3); "[,'""«»]|\.{3,}| {2,}|\s{2,}"))
Формула ищет запятые, апострофы, кавычки ("), кавычки-елочки («»), троеточие, два и более пробела подряд, пробельные символы

#2
function Vov() {
  var spreadsheet = SpreadsheetApp.getActive();
  var ch = spreadsheet.getRange('F6').getValue();

  if (ch <= 0) return;

  var sheet22 = spreadsheet.getSheetByName('Лист22');
  var october25 = spreadsheet.getSheetByName('Октябрь25');
 
  // Копируем данные из Лист22 в Октябрь25
  var sourceRanges = [
    { source: 'C9:D9', target: 'A2:B2' },
    { source: 'E9', target: 'E2' },
    { source: 'E6', target: 'D2' },
    { source: 'D11', target: 'C2' }
  ];

  sourceRanges.forEach(function(range) {
    var values = sheet22.getRange(range.source).getValues();
    october25.getRange(range.target).setValues(values);
  });

  // Очищаем ячейки в Лист22
  var clearRanges = ['C9:D9', 'E9', 'D9', 'C20'];
  clearRanges.forEach(function(range) {
    sheet22.getRange(range).clearContent();
  });

  // Вставляем новую строку в Октябрь25
  october25.insertRowBefore(2);
}
#3
Добрый день! Как то так:

function onEdit(event) {
  let ss = event.source.getActiveSheet();
  let col = event.range.getColumn();
  if (ss.getName() !== 'Лист1' || col !== 8) return;
  let newValue = event.value;
  let row = event.range.getRow();
  for (var i = 8; i < 18278; i++) {
    if (ss.getRange(row, i).getValue() == '') {
      ss.getRange(row, i).setValue(newValue);
      return;
    };
  }
};
#4
Добрый день! Макрос автоматом переносит данные на лист "Итог" при заполнении ячейки в строках "Выполнено"
https://docs.google.com/spreadsheets/d/1eLT1EYTx6s2BPkRWa0QkhJoi9KXcrHI7_7FEDGPKe-I/edit?usp=sharing
function onEdit(event) {
  var ss = event.source.getActiveSheet();
     var row = event.range.getRow();     
   var col = event.range.getColumn(); 
  if (ss.getName() !== 'август') return;
if ([6,11,16,21,26,31].indexOf(row)==-1) return; 
let arr=[]
let spreadsheet = SpreadsheetApp.getActive();
let sheet = spreadsheet.getSheetByName("Итог");
let date = ss.getRange(1,col).getValue();
let name = ss.getRange(row-3,1).getValue();
let reason = ss.getRange(row-1,1).getValue();
let sum = ss.getRange(row,col).getValue();
arr.push(date,name,reason,sum);
sheet.appendRow(arr); 
 };
#5
Так скрипт копирует лист из этой же книги:
function copySheet() {
 let ss = SpreadsheetApp.getActiveSpreadsheet();
 let sheetOld = ss.getSheetByName('Шаблон_2024');
 ss.insertSheet(0, { template: sheetOld }).setName('Месяц_2024');
}

Так скрипт копирует лист из другой книги:
function copySheet1() {
 let sheetOld = SpreadsheetApp.openById('1HLF22eVwFqFXQPrKoTDAL4MXrAXZvdZE44WjItxAIiQ').getSheetByName('Шаблон_2024');
 let ss = SpreadsheetApp.getActiveSpreadsheet();
 sheetOld.copyTo(ss).setName('Месяц_2024');
}

Так скрипт копирует из другой книги и переносит лист на первую позицию:
function copySheet2() {
 let sheetOld = SpreadsheetApp.openById('1HLF22eVwFqFXQPrKoTDAL4MXrAXZvdZE44WjItxAIiQ').getSheetByName('Шаблон_2024');
 let ss = SpreadsheetApp.getActiveSpreadsheet();
 let temp = sheetOld.copyTo(ss);
 ss.insertSheet(0, { template: temp }).setName('Месяц_2024');
 ss.deleteSheet(temp);
}

#6
Добрый день! Откройте доступ к таблице.
#7
Добрый день!
Почитайте здесь https://forbiz-online.org/rabota-s-listom-google-sheets-s-pomoshhyu-skripta/
В вашем случае:
Обратиться к листу из другой таблицы
var sh = SpreadsheetApp.openById('ID таблицы, с которой нужно скопировать лист').getSheetByName('Имя копируемого листа');

вставить лист в начале и скопировать в него другой лист
function myFunction_Button1() {
var ss = SpreadsheetApp.getActive();
var sheetOld = ss.getSheetByName('Сентябрь_2024');
ss.insertSheet(0,{template: sheetOld}).setName('Месяц_2024');
#8
Добрый день! Не надо ничего дублировать. Замените строку макроса
const specificSheet = "Лист2" на
const specificSheet = "Онлайн табло Мюнхена"  ( указываете название листа на котором макрос НЕ ДОЛЖЕН РАБОТАТЬ)
И строку :          if (sourceSheet == specificSheet && cellIndex == specificCell) {
замените на:      if (sourceSheet != specificSheet && cellIndex == specificCell) {

Макрос будет срабатывать на всех листах книги кроме указаного в строке  const specificSheet

Удачи!
#9
Добрый день! Попробуйте такой вариант с макросом. После выбора времени в столбце "А" желательно сделать секундную паузу, а потом переходить к выбору в столбце "В", чтобы макрос успел отработать.

https://docs.google.com/spreadsheets/d/1bTV-DMY7TwFoe0ob1F3jvNKEqreSjGublRxpKxWiOWM/edit?usp=sharing

[code=vb]function onEdit(e) {
  const specificSheet = "Системный лист"   // имя листа, на котором НЕ будет отслеживания изменений значений ячеек     
  const specificCellColumn = 1    // номер столбца для отслеживания изменений     

  let sheetCheck = (e.range.getSheet().getName() != specificSheet)
  let cellCheck = (e.range.getColumn() == specificCellColumn)

  if (!(sheetCheck && cellCheck)) {
    return
  }
  else {
    let spreadsheet = SpreadsheetApp.getActive();
    let shS = spreadsheet.getSheetByName("Системный лист");
    shS.getRange('M3:M14').clearContent()
    const cellValue = e.range.getDisplayValue()
    let arr1 = [['9:30:00'], ['10:00:00'], ['10:30:00'], ['11:00:00'], ['11:30:00'], ['12:00:00'], ['12:30:00']]
    let arr2 = [['14:30:00'], ['15:00:00'], ['15:30:00'], ['16:00:00'], ['16:30:00'], ['17:00:00'], ['17:30:00']]
    let index = arr1.flat().indexOf(cellValue)
    if (index !== -1) {
      arr1.splice(0, index + 1)
      shS.getRange(3, 13, arr1.length).setValues(arr1)
    }
    else {
      index = arr2.flat().indexOf(cellValue)
      arr2.splice(0, index + 1)
      shS.getRange(3, 13, arr2.length).setValues(arr2)
    }
  }
}
[/code]
#10
Добрый вечер! В таком виде макрос работать не будет. Макрос не может отслеживать изменение ячейки формулой. Попробуйте так:

function onEdit(e) {
  const arr = ['Апрель', 'Июнь', 'Сентябрь', 'Ноябрь']
  const specificSheet = "Лист2"
  const specificCell = "A12"
  const sourceSheet = e.source.getActiveSheet().getSheetName()
  const cellIndex = e.range.getA1Notation()
  if (sourceSheet == specificSheet && cellIndex == specificCell) {
    e.range.getSheet().showColumns(29, 3)
    const cellValue = e.range.getValue()
    if (arr.includes(cellValue)) {
      e.range.getSheet().hideColumns(31)
    }
    if (cellValue == 'Февраль') {
      e.range.getSheet().hideColumns(30, 2)
      //e.range.getSheet().hideColumns(29,3)//Для невысокостных годов
    }
  }
}
#11
Добрый день!  Макросом возможно. Если нормально объясните задачу - помогу.
#12
замените последнюю строчку в макросе на

sh1.getRange(i + 1,1,1,3).clear({contentsOnly: true})
#13
В общем виде так. Если заполнены все три столбца, строка переносится на другой лист

https://docs.google.com/spreadsheets/d/1PHpAY_ciznS8EgJZTp2hXI2pOWEwcQRQYqpyq9iwtpU/edit?usp=sharing

#15
Добрый день!
1.Сделайте вместо скрина таблицу с данными.
2 после какого события должна автоматически переноситься строка
3 appendRow(val) - вставляет значение 'val' в первую пустую строку на листе
Яндекс.Метрика Рейтинг@Mail.ru