Как отсортировать ячейки листов по значениям, примененным в ГАЗе?

Вот функция, которую я написал, которая итеративно создает дерево папок. Вот основная функция:

#include <io.h>
#include <string>
#include <direct.h>
#include <list>

// Returns false on success, true on error
bool createFolder(std::string folderName) {
    list<std::string> folderLevels;
    char* c_str = (char*)folderName.c_str();

    // Point to end of the string
    char* strPtr = &c_str[strlen(c_str) - 1];

    // Create a list of the folders which do not currently exist
    do {
        if (folderExists(c_str)) {
            break;
        }
        // Break off the last folder name, store in folderLevels list
        do {
            strPtr--;
        } while ((*strPtr != '\\') && (*strPtr != '/') && (strPtr >= c_str));
        folderLevels.push_front(string(strPtr + 1));
        strPtr[1] = 0;
    } while (strPtr >= c_str);

    if (_chdir(c_str)) {
        return true;
    }

    // Create the folders iteratively
    for (list<std::string>::iterator it = folderLevels.begin(); it != folderLevels.end(); it++) {
        if (CreateDirectory(it->c_str(), NULL) == 0) {
            return true;
        }
        _chdir(it->c_str());
    }

    return false;
}

Подпрограмма folderExists выглядит следующим образом:

// Return true if the folder exists, false otherwise
bool folderExists(const char* folderName) {
    if (_access(folderName, 0) == -1) {
        //File not found
        return false;
    }

    DWORD attr = GetFileAttributes((LPCSTR)folderName);
    if (!(attr & FILE_ATTRIBUTE_DIRECTORY)) {
        // File is not a directory
        return false;
    }

    return true;
}

Пример вызова, который я тестировал выше, имеет следующее (и это работает):

createFolder("C:\\a\\b\\c\\d\\e\\f\\g\\h\\i\\j\\k\\l\\m\\n\\o\\p\\q\\r\\s\\t\\u\\v\\w\\x\\y\\z");

Эта функция не прошла тщательного тестирования, и я не уверен, что она еще работает с другими операционными системами (но, вероятно, совместима с несколькими модификациями). В настоящее время я использую Visual Studio 2010 с Windows 7.

1
задан Softserve 1 March 2019 в 17:53
поделиться

1 ответ

Я думаю, что использование вспомогательной колонки, безусловно, самый простой вариант. Вы можете «спрятать» столбец, чтобы он не мешал. (Щелкните правой кнопкой мыши -> Скрыть столбец).

Но вы можете сделать это с помощью скрипта, используя функцию сравнения! Вот пример реализации. Это слишком многословно в надежде объяснить и адаптировать к вашему конкретному случаю использования.

Code.gs

// get active spreadsheet
var ss = SpreadsheetApp.getActive();

// define mapping of status to custom values
var mapping = {
  Yes: 1,
  No: 2,
  Pending: 3,
  Withdrawn: 4
};

// define range of values to sort & which one is "status"
var sortRange = "A2:B20";
var statusCol = 0;

/**
 * Sort defined range by status, using defined mapping
 * See: https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet
 */
function sortData() {
  // select sheet
  var sheet = ss.getSheets()[0];

  // select range
  var range = sheet.getRange(sortRange);

  // get values (array of arrays)
  var data = range.getValues();
  Logger.log("\ndata pre-sort: %s\n\n", data);

  // sort using custom compare function
  data.sort(sortFcn_);
  Logger.log("\ndata post-sort: %s\n\n", data);

  // write values back to spreadsheet
  range.setValues(data);
}

/**
 * Custom compare function used by sortRange
 * See: https://www.w3schools.com/jsref/jsref_sort.asp
 */
function sortFcn_(rowA, rowB) {
  // get "status" from row (array lookup by integer)
  var aStatus = rowA[statusCol];
  var bStatus = rowB[statusCol];

  // convert status msg to value (object lookup by key)
  var aValue = mapping[aStatus];
  var bValue = mapping[bStatus];

  // sort in ascending order
  return aValue - bValue;
}

Теперь вам просто нужно выяснить, как вызывать «sortData» в нужное время. Для нескольких вариантов см .:

0
ответ дан Dustin Michels 1 March 2019 в 17:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: