Как мне записать данные в каждый последний столбец? - PullRequest
0 голосов
/ 30 марта 2020

Мне нужно добавлять новый столбец каждый день, и вставка данных будет выполняться индивидуально для конкретной строки c по сравнению со входом ... пожалуйста, скажите, правильно ли это.

this is my sheet

будет ли этот фрагмент кода работать для добавления новых столбцов каждый день и инициализировать все записи на 0?

    function trig(){

    var builder = ScriptApp.newTrigger("addcol").timeBased().everyDays(1);
     var trigger = builder.create();
   }


   function addcol(){

     var cname = builder.atDate( day, month, year)
     var column = eventRange.getLastColumn();
     sheet.insertColumnAfter(column).setName(cname);
     sheet.getRange("E1").setValue(new Date()).setNumberFormat('d/M/yyyy');
     var col = [];
     for(var n=0 ; n<s.getMaxRows();n++){
       col.getLastColumn().push(['0']);
     }
     ss.getRange('N:N').setValues(col); 
   }

// теперь для части вставки

здесь sr будет сравниваться с SRN из листа (E), и если он совпадет, он заменит 0 на 1 в последнем столбце, добавляемом каждый день. пожалуйста, скажите мне, будет ли это работать?

    function doPost(e){

    var action = e.parameter.action;

    if(action == 'scanner'){
      return scanner(e);

    }

    }


    function scanner(e){

    var srn = e.parameter.sr;
    var C = sheet.getLastColumn();
    var R = sheet.getLastRow();



    for(i=1; i<=R; i++)
    {
      if (srn == sheet.getDataRange([i][2]))
      {
        sheet.getDataRange([i],[C]).push[(1)];
        sheet.append([i],[C]);
        return ContentService.createTextOutput("Success").setMimeType(ContentService.MimeType.TEXT);
        break;
      }
      }


    }

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Триггер на основе времени:

Нет объектов событий, связанных с триггерами на основе времени, поэтому переменные типа eventRange не могут работать. Кажется, вы хотите использовать переменные в addcol, которые определены в trig (например, builder). Это невозможно. Кроме того, если вы хотите, чтобы ваша функция запускалась один раз в день, вам не нужны такие строки: builder.atDate(day, month, year)). Триггер будет создан при запуске этой функции один раз:

function createTrigger(){
  var builder = ScriptApp.newTrigger("addcol").timeBased().everyDays(1).create();
}

Добавление столбца с 0:

Есть много проблем с функцией addcol:

  • Используются несколько неинициализированных переменных (s, builder, eventRange).
  • Используются несуществующие методы: например: setNumberFormat - это метод класса Range, не объекта Date. Вам следует использовать Utilities.formatDate (date, timeZone, format) для форматирования дат. Кроме того, вы используете setName при вставке нового столбца, но это меняет имя листа. Это то, что вы хотите сделать? Кроме того, cname назначается триггером в качестве значения, которое, я серьезно сомневаюсь, является вашей целью. Точно так же массив col не имеет метода getLastColumn().

Вы можете использовать эту функцию addcol вместо этого (измените имя листа, в настоящее время установленное на Your sheet name, и timeZone в formatDate, в настоящее время установлен на GMT:

function addcol() {
  var sheet = SpreadsheetApp.getActive().getSheetByName("Your sheet name"); // Change accordingly
  var lastCol = sheet.getLastColumn();
  var lastRow = sheet.getLastRow();
  if (sheet.getMaxColumns() === lastCol) sheet.insertColumnAfter(lastCol);
  var newCol = sheet.getRange(1, lastCol + 1, lastRow, 1);
  var values = [];
  values.push([Utilities.formatDate(new Date(), "GMT", "d/M/yyyy")]); // Change accordingly
  for (var i = 1; i < sheet.getLastRow(); i++) {
    values.push([0]);
  }
  newCol.setValues(values);
}

Замена 0 на 1:

Предполагается, что вы получаете функцию scanner для правильного запуска и что параметр e.parameter.sr заполняется правильно, вы можете сделать следующее:

function scanner(e){
  var srn = e.parameter.sr;
  var C = sheet.getLastColumn();
  var R = sheet.getLastRow();
  for (i=1; i<=R; i++) {
    if (srn == sheet.getRange(i, 2).getValue()) {
      sheet.getRange(i, C).setValue(1);
    }
  }    
}

Здесь вы также использовали несуществующие методы или указали неверные параметры:

  • Метод getDataRange не допускает никаких аргументов, вы должны использовать getRange (row, column) и указывать индексы строк и столбцов, разделенные запятыми, а не пытаясь получить доступ к 2D-массиву.
  • break завершает текущий l oop, поэтому используйте его, только если вы хотите обновить только 1 ячейку. То же самое касается return, который завершает текущее выполнение функции.

Ссылка :

1 голос
/ 30 марта 2020

Short

Нет

Long

Есть несколько проблем со сценарием:

  1. getDataRange() ожидает, что аргументы не переданы (только в документах говорится, что такой же , что и при использовании getRange(yourSheet.getLastRow(), yourSheet.getLastColumn()), а не то, что вы должны это делать). Конечно, он не ожидает экземпляров Array (скобки [] обозначения заключают C и i, которые имеют тип Number в один). Более того, он возвращает Range, который на момент написания не имеет метода push().
  2. getLastColumn() возвращает экземпляр Number и, следовательно, не имеет метода push() также. Однако вы на правильном пути, поскольку col - это Array, и вам нужно push() в него.
  3. Если вы хотите, чтобы скрипт добавил заполненный нулями столбец, не делайте • получить постоянные диапазоны: в текущем состоянии getRange('N:N') гарантирует, что каждый раз, когда вы будете повторно инициализировать столбец N. Между прочим, то же самое относится и к getRange("E1").
  4. Вы все еще не решали проблемы, перечисленные в комментарии к вашему предыдущему вопросу.
  5. Кроме того, в вашей функции scanner есть синтаксическая ошибка: push[(1)] должно быть push([1]).
  6. Кроме того, sheet переменная либо необъявлена, либо объявлена ​​глобально, , что плохо .

Примечания

  1. Если вы этого не сделаете ожидая, что число студентов будет меняться динамически, вы можете переключиться с getMaxRows() на getLastRow() только на те ячейки с нулевым заполнением, которые находятся в диапазоне текущей информационной сетки учащихся.
  2. Этот вопрос прямое продолжение из текущего закрытого (пожалуйста, всегда раскрывайте это как минимум для справки).
  3. Как насчет * 10 67 * пропуск init к нулевому шагу вообще? Если ячейка пуста, getValue() / getValues() вернет ее значение в виде пустой строки, которая является значением falsy , как и 0. Если вы хотите подсчитать посещаемость в конце периода, для суммирования достаточно простого условия.
  4. Тип MIME по умолчанию для экземпляра TextOutput, полученного с помощью createTextOutput(), представляет собой простой текст, поэтому установите его на ContentService.MimeType.TEXT - это избыточное количество в вашем случае.

Ссылка

  1. getDataRange() документы
  2. getLastColumn() документы
  3. getValue() документы
  4. getValues() документы
  5. Range документы
  6. createTextOutput() документы
  7. Объяснение ложных значений в MDN
...