Я хочу написать скрипт для чтения и регистрации значений определенной строки и копирования их на новый лист - PullRequest
0 голосов
/ 11 июля 2019

Я хочу построить скрипт для автоматизации создания формы из определенных значений.

Что мне нужно сделать, это:

  • Спросите пользователя, какая строка относится к форме, введите строку в текстовое поле
  • Значение журнала столбца A этой строки (Дата)
  • Проверьте эту строку из столбца C-ZZZ для значений (чисел)
  • если есть ячейка со значением, запишите значение. Если ячейка пуста, игнорируйте ее
  • Если в ячейке есть значение, дополнительно записываются значения строки 1-10 этого столбца (числа + строки)
  • создать новый лист
  • копировать зарегистрированные значения в определенном порядке на этот новый лист (другой порядок, чем на первом листе)

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

Запросить у пользователя строку (сообщение об ошибке NaN не работает):

function tourzettelZeile() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var rowIdxStr = Browser.inputBox("For which row do you want to make the list?");
  if (rowIdxStr == 'cancel') {
    return;
  }
  var rowIdx = parseInt(rowIdxStr);
  if (rowIdx == NaN) {
    Browser.msgBox("Numbers only or 'cancel'");
    return;
  }  

}

Моя попытка регистрации и вставки данных:

function readData(spreadsheetID)
{
  var spreadsheetId = '1KdZNvKgwL6NMuF0FYGB8jBhRVpbwv954D_UcBZ22eh0';
  var plakatMenge = Sheets.Spreadsheets.Values.get(spreadsheetId, 'PlakatTool2019!DK15:DK900');
  var plakatFormat = Sheets.Spreadsheets.Values.get(spreadsheetId, 'PlakatTool2019!DK4');  
  var plakatName = Sheets.Spreadsheets.Values.get(spreadsheetId, 'PlakatTool2019!DK15:DK1');  
  var plakatiererName = Sheets.Spreadsheets.Values.get(spreadsheetId, 'PlakatTool2019!FK66');  
  var plakatInfo = Sheets.Spreadsheets.Values.get(spreadsheetId, 'PlakatTool2019!DK7');  
  var plakatGebiet = Sheets.Spreadsheets.Values.get(spreadsheetId, 'PlakatTool2019!FL66');   
  var auftragDatum = Sheets.Spreadsheets.Values.get(spreadsheetId, 'PlakatTool2019!A66');  
  Logger.log(plakatMenge.values);
  Logger.log(plakatFormat.values);
  Logger.log(plakatName.values);
  Logger.log(plakatiererName.values);
  Logger.log(plakatInfo.values);
  Logger.log(plakatGebiet.values);
  Logger.log(auftragDatum.values);
  Browser.msgBox(plakatMenge + plakatFormat + plakatName + plakatiererName + plakatInfo + plakatGebiet + auftragDatum);

  //Neues Sheet erstellen  
  var requests = [{
    'addSheet': {
      'properties': {
        'title': 'Tourzettel',
        'gridProperties': {
          'rowCount': 80,
          'columnCount': 14
        },
        'tabColor': {
          'red': 1.0,
          'green': 0.3,
          'blue': 0.4
        }
      }
    }
  }];

  var response =
      Sheets.Spreadsheets.batchUpdate({'requests': requests}, spreadsheetId);
  Logger.log('Created sheet with ID: ' +
      response.replies[0].addSheet.properties.sheetId);

  //writeValues
  // Specify some values to write to the sheet.
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  // ss is now the spreadsheet the script is associated with
  var sheet = ss.getSheets()[5];
var values = [
  [plakatMenge.values, "Gebiet", plakatFormat.values, plakatName.values, plakatiererName.values, plakatInfo.values, plakatGebiet.values, auftragDatum.values]
  ];
  var range = sheet.getRange("A1:H1");
  range.setValues(values);
}

Оба этих скрипта не делают правильных действий и не объединяются (информация о том, какую строку проверять, ничего не делает)

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Эта функция пытается выполнить первые пять пунктов в вашем списке: Не стесняйтесь использовать и отлаживать, потому что я вообще не отлаживал.

function readAndLog() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var row=SpreadsheetApp.getUi().prompt('Enter Row Number').getResponseText();
  if(typeof(row)!=Number) {
    throw("Invalid Response: terminating script");
    return;
  }else{
    Logger.log(sh.getRange(row,1).getValue());
    var vA=sh.getRange(row,3,1,sh.getLastColumn()-3).getValues();
    var rA=[];
    for(var i=0;i<vA.length;i++) {
      if(vA[0][1] && typeOf(vA[0][i])==Number) {
        rA.push({col:i+1,val:vA[0][i]});
        Logger.log('column: %s, value: %s',rA[i].col,rA[i].val);
        var cA=sh.getRange(1,rA[i].col,10,1).getValues();
        for(var j=0;j<cA.length;j++) {
          Logger.log('col: %s, row: %s value: %s',rA[i].col, j+1, cA[0][j]);
        }
      }
    }
  }
}

Спасибо, это очень помогло.Мне пришлось избавиться от этой части:

 if(typeof(row)!=Number) {
        throw("Invalid Response: terminating script");
        return;
      }else{

Поскольку это дало мне ошибку, я не смог решить.

Я немного добавил к коду:

function Tourzettel(){
  readAndLog();
  newSheet();
  logOutput();
}


function readAndLog() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var row=SpreadsheetApp.getUi().prompt('Gib die Zeile mit dem Datum für die Tour ein').getResponseText();
    Logger.log(sh.getRange(row,1).getValue());
    var vA=sh.getRange(row,3,1,sh.getLastColumn()-3).getValues();
    var rA=[];
    for(var i=0;i<vA.length;i++) {
      if(vA[0][1] && typeOf(vA[0][i])==Number) {
        rA.push({col:i+1,val:vA[0][i]});
        Logger.log('column: %s, value: %s',rA[i].col,rA[i].val);
        var cA=sh.getRange(1,rA[i].col,10,1).getValues();
        for(var j=0;j<cA.length;j++) {
          Logger.log('col: %s, row: %s value: %s',rA[i].col, j+1, cA[0][j]);
        }
      }
    }
  }
// Create new sheet
function newSheet() {
 var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 var yourNewSheet = activeSpreadsheet.getSheetByName("TourzettelV2");

    if (yourNewSheet != null) {
        activeSpreadsheet.deleteSheet(yourNewSheet);
    }

    yourNewSheet = activeSpreadsheet.insertSheet();
    yourNewSheet.setName("TourzettelV2");
}

// Log in das neue Sheet schreiben

function logOutput() {

var stringToWrite = Logger.log;
SpreadsheetApp.getActive().getSheetByName('TourzettelV2').getRange("A1").setValue(stringToWrite);

}

Моя проблема сейчас заключается в функции logOutput, потому что Logger.log, похоже, не работает.Он выводит:

function log() {
        [native code, arity=0]
}

Не уверен, что именно он там записал, но это не похоже на значения ячеек.Я хочу, чтобы каждое зарегистрированное значение было помещено в отдельную ячейку.

0 голосов
/ 11 июля 2019

Чтобы исправить ошибку NaN, попробуйте это:

if (isNan(rowIdx)) {
    Browser.msgBox("Numbers only or 'cancel'");
    return;
  }  

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

readData(rowIdx);

И тогда вторая функция будет

function readData(rowIdx) {
...
}

И затем он может использовать переменную rowIdx в сценарии. Я предполагаю, что 2-й функции не нужен переданный ей spreadsheetID, как это предусмотрено в первой строке функции. (Или это потому, что вы тестировали?)

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