#google-apps-script #google-sheets #google-sheets-api
#google-приложения-скрипт #google-листы #google-таблицы-api
Вопрос:
Мне нужно было бы изменить то, как работает этот макрос
function getDynamicRow(){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName('B.Wioski'); var sourceRange = sheet.getRange('A1:F26500'); var data = sourceRange.getValues(); // Array of arrays [[Row1],[Row1],[Row3]] // add data to next empty row in the static sheet. var targetSheet = ss.getSheetByName('TW'); targetSheet.getRange(targetSheet.getLastRow() 1, 1, data.length, data[0].length).setValues(data); }
в настоящее время макрос помещает записи одну под другой, и мне нужно, чтобы он размещал записи справа от изображения предварительного просмотра ниже
кроме того, мне понадобится макрос для удаления данных старше 5-7 дней
Комментарии:
1. Пожалуйста, предоставьте данные в вашем примере в виде таблицы, чтобы мы могли скопировать и вставить их. Решение, которое вам требуется, довольно простое, за исключением удаления данных старше 5 дней, поскольку в данных нет временных меток. Где вы хотите разместить метки времени.
2. Я думал вставить функцию =IF(J2lt;gt;»»;ЕСЛИ(J1=»»;СЕГОДНЯ();J1);»»)
3. было бы лучше, если бы эта дата была первой строкой
Ответ №1:
Предложение
Возможно, вы можете попробовать эту реализацию ниже:
Скрипт:
function getDynamicRow(){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName('B.Wioski'); var sourceRange = sheet.getRange('A1:F' sheet.getLastRow()); var data = sourceRange.getValues(); // Array of arrays [[Row1],[Row1],[Row3]] data.push(["","","","","",new Date()]); //added a timestamp for reference on deleting older data // add data to next empty row in the static sheet. var targetSheet = ss.getSheetByName('TW'); var currentCol = targetSheet.getDataRange().getNumColumns(); if(currentCol != 1)currentCol = currentCol 1; targetSheet.getRange(1, currentCol, data.length, data[0].length).setValues(data); }
Примерный Результат:
После запуска сценария один раз:
После повторного запуска (так далее и так далее) :
Что касается удаления данных старше 5-7 дней, вот моя реализация, которую вы можете попробовать:
Поскольку я добавил метку времени на все скопированные данные на листе TW
, вы можете обратиться к этому образцу сценария ниже:
обновленный
Скрипт:
function deleteOlderThan5To7Days(){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var targetSheet = ss.getSheetByName('TW'); var row = targetSheet.getDataRange().getLastRow(); var col = targetSheet.getDataRange().getLastColumn(); var data = targetSheet.getRange(row,1,1,col).getValues(); for(x=0; xlt; data[0].length; x ){ var curCol = x 1; if(data[0][x] != ""){ var getDate = Utilities.formatDate(new Date(data[0][x]), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "dd"); var checkDays = getDate - new Date().getDate(); if(new Date(data[0][x]).getMonth() 1 == new Date().getMonth() 1){ //If data timestamp is within the current month if(checkDays gt; 5){ //Check if the timestamp of the data is more than 5 - 7 days Logger.log("Current row date: " data[0][x] "n" "Found on column #" curCol " is " checkDays " days older"); Logger.log("Delete data column " curCol); targetSheet.insertColumnsAfter(targetSheet.getLastColumn(),1); //add a blank column on every deletion targetSheet.deleteColumn(curCol); //delete the points column data return; }else{ //Data timestamp is NOT older than 5-7 days"); } }else{ //Data was copied last month or older that the current month Logger.log("Current row date: " data[0][x] "n" "Found on column #" curCol " is old"); Logger.log("Delete data column " curCol); targetSheet.insertColumnsAfter(targetSheet.getLastColumn(),1); //add a blank column on every deletion targetSheet.deleteColumn(curCol); //delete the points column data return; } } } }
Демонстрация образца:
Допустим, первые данные были скопированы 2 ноября 2021 года или 11/2/2021
, как показано здесь, на листе образцов на TW
:
После запуска примера функции deleteOlderThan5To7Days
, вот результат:
Журналы выполнения для просмотра:
записка:
Тот же процесс удаления применяется, если когда-либо месяц совпадает с текущим месяцем, но старше 5-7 дней.
Комментарии:
1. спасибо, это отличный код
2. я изменил его для своих нужд, но мне нужна помощь, теперь нужно, чтобы первые 5 столбцов были несъемными из столбца F, который нужно удалить. Можете ли вы переписать код, чтобы удалить только столбцы даты?
3. Спасибо за ваш ответ. Что касается первых 5 столбцов, которые вы должны быть несъемными, мне это совершенно непонятно. Просто для уточнения, вы имеете в виду, что хотите удалить только столбец
Points
с датой метки времени старше 5-7 дней, верно?4. Да, меня интересует только колонка Баллов. Столбцы LP, название деревни, позиция X, позиция Y и идентификатор игрока не являются переменными
5. Я обновил свой скрипт для
deleteOlderThan5To7Days
своего ответа, чтобы удалить толькоPoints
столбец с датой метки времени старше 5-7 дней