Google Apps 脚本子字符串

Google Apps Script Substring

在我的电子表格中,我有一个存储在子文件夹中的图像的文件路径。图像是这样存储的,因为我正在使用 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 "";
      }
    }
  }
}

预期结果是文件路径的子字符串,可用于检索可附加到文档正文的图像。

这里是link到spreadsheet

我对您的代码做了几处更改,包括 Cooper 提出的修改。它正在检索子字符串并将图像成功添加到文件中。我希望它对你有用:

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);
}