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

Я работаю над проектом, в котором я застреваю только на последнем этапе.

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

который определит фильтр и sectionSelect который определит имя листа.

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

К вашему сведению: сценарий приложения привязан к gsheet.

Вот код:

      function doGet(e) {
  var ss = SpreadsheetApp.openByUrl("sheetURL")
  var sheet = ss.getSheetByName(Location);

  return TagData(e,sheet);
}

function doPost(e) {
  var ss = SpreadsheetApp.openByUrl("sheetURL")
  var sheet = ss.getSheetByName(Location);

  return TagData(e,sheet);
}

function TagData(e) {
  var Location = e.parameter.Location; // send from app with respective tag
  var sectiontSelect = e.parameter.sectiontSelect; // send from app with respective tag

  sheet.append([Location, sectiontSelect])
}

function FilterOnText() { 
  var ss = SpreadsheetApp.getActive()
  var range = ss.getDataRange();
  var filter = range.getFilter() || range.createFilter()
  var text = SpreadsheetApp.newFilterCriteria().whenTextContains(Location); // the location will be as per the location variable in the TagData function
  filter.setColumnFilterCriteria(1, text);
}

function titleAsDate() { 
  const currentDate = Utilities.formatDate(new Date(), "GMT+4", "dd-MM-yyyy HH:mm:ss");
  return SpreadsheetApp.create("Report of the " + currentDate);
}

function copyWithValues() {
  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  const sourceSheet = spreadSheet.getSheetByName(sectionSelect); // fromApp variable will define which sheet the data will be copied (situated in the TagData function)
  const temp_sheet = spreadSheet.insertSheet('temp_sheet');
  const sourceRange = sourceSheet.getFilter().getRange();
  sourceRange.copyTo(
    temp_sheet.getRange('A1'),
    SpreadsheetApp.CopyPasteType.PASTE_NORMAL,
    false);
  SpreadsheetApp.flush();
  
  const sourceValues = temp_sheet.getDataRange().getValues();
  
  const targetSpreadsheet = titleAsDate();
  
  const rowCount = sourceValues.length;
  const columnCount = sourceValues[0].length;
  
  const targetSheet = targetSpreadsheet.getSheetByName('Sheet1').setName("Report"); // renamed sheet
  const targetRange = targetSheet.getRange(1, 1, rowCount, columnCount);
  targetRange.setValues(sourceValues);
  spreadSheet.deleteSheet(temp_sheet);
} 

function MoveFiles(){ 
  var files = DriveApp.getRootFolder().getFiles();
  var file = files.next();
  var destination = DriveApp.getFolderById("1wan7PLhl4UFEoznmsN_BVa2y4AtFaCOr");
  destination.addFile(file)
  var pull = DriveApp.getRootFolder();
  pull.removeFile(file);
}

function clearFilter() { // clearance of filters applied in first function
 var ss = SpreadsheetApp.getActiveSpreadsheet(); 
 var sheet = ss.getSheetByName("testo"); 
 sheet.getFilter().remove(); 
}

1 ответ

Объяснение:

Две проблемы:

  1. ничего не возвращает (как указал Купер)

  2. TagData(e) имеет только один параметр e но вы передаете два параметра TagData(e,sheet) когда вы вызываете его из функций и.

Не уверен, что это решит все ваши проблемы, но решит те, о которых я упоминал выше.

Решение:

  1. Удалить return заявления от doGet и doPost из-за вопроса 1).

  2. Добавить sheet параметр в TagData функция.

Результирующий код:

      function doGet(e) {
  var ss = SpreadsheetApp.openByUrl("sheetURL")
  var sheet = ss.getSheetByName(Location);
  TagData(e,sheet); // modified
}

function doPost(e) {
  var ss = SpreadsheetApp.openByUrl("sheetURL")
  var sheet = ss.getSheetByName(Location);
  TagData(e,sheet); // modified
}

// added the sheet parameter
function TagData(e,sheet) {
  var Location = e.parameter.Location; // send from app with respective tag
  var sectiontSelect = e.parameter.sectiontSelect; // send from app with respective tag   
  sheet.append([Location, sectiontSelect]);
}

// rest of your code..

Или попробуйте это:

      function doGet(e) {
  var ss = SpreadsheetApp.openByUrl("sheetURL")
  var sheet = ss.getSheetByName(Location);
  var params = JSON.stringify(TagData(e,sheet)); // modified
  return HtmlService.createHtmlOutput(params); // added
}

function doPost(e) {
  var ss = SpreadsheetApp.openByUrl("sheetURL")
  var sheet = ss.getSheetByName(Location);
  ContentService.createTextOutput(JSON.stringify(e))
}

// added the sheet parameter
function TagData(e,sheet) {
  var Location = e.parameter.Location; // send from app with respective tag
  var sectiontSelect = e.parameter.sectiontSelect; // send from app with respective tag   
  sheet.append([Location, sectiontSelect]);
  return { Location: Location, sectiontSelect: sectiontSelect }
  
}
Другие вопросы по тегам