Подстрока скрипта Google Apps - PullRequest
0 голосов
/ 24 сентября 2019

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

Данные, хранящиеся в электронной таблице, также должны быть извлечены и применены к шаблону, и я делаю для этого скрипт Google Apps.У меня есть функциональный скрипт, который находит шаблон и извлекает выбранную пользователем строку данных, но я не могу извлечь необходимое изображение.

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

В блоке кода, где я пытаюсь создать подстроку, я получаю сообщение об ошибке в строке sig = signature.getText();.Ошибка: TypeError: signature.getText is not a function (line 176, file "Code").

Вот как выглядит путь к файлу Signatures/FT101.Signed (%SIGNED%).103735.png, а подстрока, которая мне нужна, будет выглядеть следующим образом FT101.Signed (%SIGNED%).103735.png

Я пробовал несколько методов, которые былипредоставлены другими вопросами о переполнении стека, а также любыми потенциальными методами, доступными в справочнике скриптов Google Apps.

Следующая функция берет пользовательский ввод из приглашения и использует его для поиска нужного номера строки.Затем он берет данные из этой строки и применяет их к шаблону на основе категории, к которой относятся данные.

var response = {};
var sign = "";

function chooseRowMethod(templateId){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var dataRange = sheet.getDataRange();
  var values = dataRange.getValues();
  var data = sheet.getRange(2, 2, 11, 18).getValues();//starting with row 2 and column 1 as our upper-left most column, get values from cells from 1 row down, and 15 columns along - hence (2,1,1,15)
  var docTitle = sheet.getRange(2, 2, 11, 1).getValues();//this is grabbing the data in field B2
  var docTitleTagNumber = sheet.getRange(2, 3, 11, 1).getValues();
  var today = new Date();
  var dd = today.getDate();
  var mm = today.getMonth() + 1;
  var yyyy = today.getFullYear();
  today = dd + '/' + mm + '/' + yyyy;

  for(var i = 0; i < values.length; i++){
    for(var j = 0; j < values[i].length; j++){
      if(values[i][j] == response){
        Logger.log(i);
        var row = data[i - 1];
        var docId = DriveApp.getFileById(templateId).makeCopy().getId();

        var doc = DocumentApp.openById(docId);
        var body = doc.getActiveSection();
        body.replaceText("%SITEID%", row[0]);
        body.replaceText("%TAG%", row[1]);
        ...
        body.replaceText("%SAT%", row[14]);

        var signature = sheet.getRange(2, 18, 11, 1).getValues();
        var sig;
        var sign = {};

        for(var i = 0; i < values.length; i++){
          for(var j = 0; j < values[i].length; j++){
            if(values[i][j] == response){
              sig = signature.getText();
              sign[i][0] = sig.substring(sig.indexOf("/") + 1);
            }
          }
        }

        var sigFolder = DriveApp.getFolderById("1LiJKGjTbpvRZ5RrMTQoyTuAjrozA14FN");

        var file = sigFolder.getFilesByName(sign);
        var image = file.getId();

        body.appendImage(image);
        doc.saveAndClose();

        var file = DriveApp.getFileById(doc.getId());
        var newFolder = DriveApp.getFolderById("16wRGBVdV0OZ5YfKhqEQSFMsux-ekGCCa");
        newFolder.addFile(file); 
        var newDocTitle = docTitle[i - 1][0];
        var newDocTagNumber = docTitleTagNumber[i - 1][0];

        doc.setName(newDocTitle + " " + newDocTagNumber + " " + today);
      }
    }
  } 
}

Здесь я пытался получить изображение.

        var signature = sheet.getRange(2, 18, 11, 1).getValues();
        var sig;
        var sign = {};

        for(var i = 0; i < values.length; i++){
          for(var j = 0; j < values[i].length; j++){
            if(values[i][j] == response){
              sig = signature.getText();
              sign[i][0] = sig.substring(sig.indexOf("/") + 1);
            }
          }
        }

        var sigFolder = DriveApp.getFolderById("1LiJKGjTbpvRZ5RrMTQoyTuAjrozA14FN");

        var file = sigFolder.getFilesByName(sign);
        var image = file.getId();

        body.appendImage(image);

Эта следующая функция дает пользователю приглашение и применяет правильный шаблон.

function chooseRow(){
  var ui = SpreadsheetApp.getUi(); // Same variations.
  var result = ui.prompt('Please enter the Tag number of the row you wish to print.', ui.ButtonSet.OK_CANCEL);

  var button = result.getSelectedButton();
  response = result.getResponseText();
  if (button == ui.Button.OK) {
    // User clicked "OK".
    ui.alert('Your tag number is' + response + '.');
  } else if (button == ui.Button.CANCEL) {
    // User clicked X in the title bar.
    ui.alert('You closed the dialog.');
    return 'the end';
  }

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var dataRange = sheet.getDataRange();
  var values = dataRange.getValues();
  var category = sheet.getRange(2, 4, 11, 1).getValues();
  var templateId = {};

  for(var i = 0; i < values.length; i++){
    for(var j = 0; j < values[i].length; j++){
      if(values[i][j] == response && category[i - 1][0] == "Instrument"){
        templateId = "1cx2-6ju-o7DaRPnbuYxxdvVVFeGQzpTXaXV3wMuRpqo";
        chooseRowMethod(templateId);
        return "";
      } else if(values[i][j] == response && category[i][0] == "Motor" || values[i][j] == response && category[i][0] == "Valve"){
        templateId = "1sYx_JcoDHY-pzjEDlxMMa3dtdzOOE8CyyLGQk8WHg7s";
        chooseRowMethod(templateId);
        return "";
      }
    }
  }
}

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

Вот ссылка на электронную таблицу .

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Попробуйте заменить это:

var file = sigFolder.getFilesByName(sign);
var image = file.getId();
body.appendImage(image);
doc.saveAndClose();

на это:

var files=sigFolder.getFilesByName(sign);
var n=0;
while(files.hasNext()) {
  var file=files.next();
  n++;
}
if(n>1)SpreadsheetApp.getUi().alert('There is more than one file with this name: ' + sign);
var image = file.getId();
body.appendImage(image);
doc.saveAndClose();

или это:

var files=sigFolder.getFilesByName(sign);
if(files.hasNext())var file=files.next()
if(files.hasNext())throw('You have more than one file with this name: ' + sign);
var image = file.getId();
body.appendImage(image);
doc.saveAndClose();
0 голосов
/ 26 сентября 2019

Я сделал несколько изменений в вашем коде, включая редактирование, предложенное Купером.Он извлекает подстроку и успешно добавляет изображение в файл.Я надеюсь, что это сработает для вас:

function chooseRow(){
  var ui = SpreadsheetApp.getUi(); // Same variations.
  var result = ui.prompt('Please enter the Tag number of the row you wish to print.', ui.ButtonSet.OK_CANCEL);
  var button = result.getSelectedButton();
  response = result.getResponseText();
  if (button == ui.Button.OK) {
    // User clicked "OK".
    ui.alert('Your tag number is' + response + '.');
  } else if (button == ui.Button.CANCEL) {
    // User clicked X in the title bar.
    ui.alert('You closed the dialog.');
    return 'the end';
  }
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var tags = sheet.getRange(2, 4, 11, 1).getValues();
  var category = sheet.getRange(2, 3, 11, 1).getValues();
  for(var i = 0; i < tags.length; i++){
    if(tags[i][0] == response && category[i][0] == "Instrument"){
      var templateId = "my_template_id";
      chooseRowMethod(templateId, i);
      return ""; // You don't need to return empty string, just return null
    } else if(tags[i][0] == response && category[i][0] == "Motor" || tags[i][0] == response && category[i][0] == "Valve"){
      var templateId = "my_template_id_bis";
      chooseRowMethod(templateId, i);
      return ""; // You don't need to return empty string, just return null
    }
  }
}

Функция chooseRowMethod получает индекс строки, выбранный пользователем в chooseRow, чтобы его не нужно было искать снова:

function chooseRowMethod(templateId, rowNumber){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var data = sheet.getRange(2, 2, 11, 18).getValues();
  var today = new Date();
  var dd = today.getDate();
  var mm = today.getMonth() + 1;
  var yyyy = today.getFullYear();
  today = dd + '/' + mm + '/' + yyyy;

  var row = data[rowNumber];
  var docTitle = row[1];
  var docTitleTagNumber = row[2];
  var docId = DriveApp.getFileById(templateId).makeCopy().getId();
  var doc = DocumentApp.openById(docId);
  var body = doc.getActiveSection();
  body.replaceText("%SITEID%", row[0]);
  body.replaceText("%TAG%", row[1]);
  // ...
  body.replaceText("%SAT%", row[14]);

  var signature = row[17];
  var sign = signature.substring(signature.indexOf("/") + 1);

  var sigFolder = DriveApp.getFolderById("my_sigfolder_id");
  var files=sigFolder.getFilesByName(sign);
  var n = 0;
  while(files.hasNext()) {
    var file=files.next();
    n++;
  } if(n>1) {
    SpreadsheetApp.getUi().alert('There is more than one file with this name: ' + sign);
  }
  body.appendImage(file);
  doc.saveAndClose();

  var file = DriveApp.getFileById(doc.getId());
  var newFolder = DriveApp.getFolderById("my_newfolder_id");
  newFolder.addFile(file); 
  doc.setName(docTitle + " " + docTitleTagNumber + " " + today);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...