Google Sheets: Как автоматически вставить слово в ячейку при обнаружении новой строки? - PullRequest
0 голосов
/ 18 февраля 2020

Я искал все выше и ниже, но мне не удалось найти ответ (я уверен, что я не объясняю его правильно)

У меня есть Google Sheet с несколькими листами (вкладками), помеченными как TabA, TabB и Tab C.

На этом листе Google я отправляю команду Sla sh в Slack, которая затем автоматически заполняет строку на одной из вкладок с помощью скрипта apps.

Я пытаюсь просто вставить слово TabA в указанную ячейку c каждый раз, когда обнаруживается новая строка. И вставьте слово TabB, когда на листе TabB будет создана новая строка и т. Д. c.

Я уверен, что просто неправильно набираю свои вопросы, поэтому я не могу найти ответ.

На самом деле я не уверен, какая часть кода размещается на листе, я думаю, что это так?

  if(sheetName) {
    sheetName = sheetName.charAt(0).toUpperCase() + sheetName.slice(1)
  } else {
    sheetName = "Current"
  }

  // Find sheet
  var sheetFlag = false;
  for (var r = 1; r < settings.length; r++) {
    if (settings[r][1] == channelID) {
      var sheetID = settings[r][2];
      var targetChannelID = settings[r][4];
      var title = settings[r][0];
      sheetFlag = true;
      break;
    }
  }

  if (sheetFlag) {
    var sheet = SpreadsheetApp.openById(sheetID).getSheetByName(sheetName);
    if(!sheet) {
      sheet = SpreadsheetApp.openById(sheetID).insertSheet(sheetName);
    }

    var lastRow = sheet.getLastRow();

    var slackDetails = ["", "", text1, "","","","","",realName, new Date(),title,text2];

    // paste the slack details to the sheet
    sheet.getRange(lastRow + 1,1,1,slackDetails.length).setValues([slackDetails]);```
Thank you in advance

1 Ответ

1 голос
/ 18 февраля 2020

Если я вас правильно понял, вы хотите:

  • Следите за новыми строками, которые добавляются к каждому листу в вашей электронной таблице (TabA, TabB, TabC).
  • Пишите имя листа в последовательных строках столбца D каждого листа при каждом обнаружении строк новостей .

Как вам сказали в комментариях В Apps Script нет триггеров для отслеживания изменений, внесенных в электронную таблицу скриптом. Например, onEdit trigger "запускается автоматически, когда пользователь изменяет значение любой ячейки в электронной таблице".

Обходной путь (свойства триггера и сценария на основе времени) :

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

function createTrigger() {
  ScriptApp.newTrigger("trackRows")
  .timeBased()
  .everyMinutes(1)
  .create();
}

Это вызовет функцию trackRows каждую минуту. Цель этой функции - отслеживать изменения в каждой строке листа с момента его последнего запуска (в этом примере - 1 минута go) и записывать имя листа в определенную ячейку, если на листе больше строк с содержимым, чем во время последнего выполнения .

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

Функция trackRows может быть чем-то вроде следующих строк:

function trackRows() {
  var props = PropertiesService.getScriptProperties();
  var ss = SpreadsheetApp.openById("your-spreadsheet-id"); // Please change accordingly
  var sheets = ss.getSheets();
  sheets.forEach(function(sheet) {
    var sheetName = sheet.getName();
    var currentRows = sheet.getLastRow();
    var oldRows = props.getProperty(sheetName);
    if (currentRows > oldRows) {
      var firstRow = 2;
      var column = 4;
      var numRows = sheet.getLastRow() - firstRow + 1;
      var rowIndex = sheet.getRange(firstRow, column, numRows).getValues().filter(function(value) {
        return value[0] !== "";
      }).length;
      var cell = sheet.getRange(rowIndex + firstRow, column);
      cell.setValue(sheetName);
    }
    props.setProperty(sheetName, currentRows);
  });
}

Эта функция делает следующее:

  • Получение свойств сценария, которые были сохранены в предыдущих выполнениях.
  • Получить все листы в электронной таблице.
  • Проверить последнюю строку с содержанием на каждом листе (через Sheet.getLastRow () ) и сравнить значение с ранее сохраненным в свойства скрипта.
  • Если текущая последняя строка больше, чем в свойствах, запишите имя листа в первой пустой строке столбца D соответствующей (начиная с D2) .
  • Сохранение текущей последней строки в свойствах скрипта.

Примечания:

  • Сценарий добавляет имя листа в первую пустую строку столбца D один раз , если он обнаружит, что были добавлены новые строки. Он не учитывает , сколько строк было добавлено с момента последнего выполнения, он учитывает , если было добавлено строк. Однако это легко изменить, если вы этого хотите.
  • Если вы хотите начать с fre sh, было бы полезно удалить все ранее сохраненные свойства. Для этого вы можете запустить эту функцию один раз:
function deleteProps() {
  var props = PropertiesService.getScriptProperties();
  props.deleteAllProperties();
}

Ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...