簡體   English   中英

使用 Google 工作表中的腳本修改導入數據中的每一行

[英]Modify each row in imported data with a script in Google sheet

我有一段代碼用於將數據導入到多張工作表中,並且運行良好。 但我也在嘗試修改特定列中的所有數據,以將其轉換為 HTML 按鈕。 目標是將www.mylink.com變成 Button

這是我用來導入數據的代碼(獲取數據,對其進行過濾並將其放入工作表中的文件夾中)

function myfunction() {
  var keywords = ["valuetoremove1", "valuetoremove2"]; //  filter the column "C".

  // Retrieve CSV data.
  var csvUrl = "https://myurl";
  var csvContent = UrlFetchApp.fetch(csvUrl).getContentText();
  var csvData = Utilities.parseCsv(csvContent, ";");

  // Retrieve Spreadsheet and put the CSV data.
  var root = DriveApp.getFoldersByName("Folder1");
  while (root.hasNext()) {
    var folder = root.next();
    var files = folder.getFiles();
    while (files.hasNext()) {
      var spreadsheet = SpreadsheetApp.open(files.next());
      var name = spreadsheet.getName().toUpperCase();
      var values = csvData.reduce((ar, r) => {
        if (!keywords.some(e => r[2].toUpperCase().includes(e.toUpperCase())) && r.join("").toUpperCase().includes(name)) {
          ar.push(r);
        }
        return ar;
      }, []);
      if (values.length == 0) continue;
      var sheet = spreadsheet.getSheets()[0];
      sheet.clearContents().getRange(2, 1, values.length, values[0].length).setValues(values);

我嘗試了一個代碼來更改單個頁面中的鏈接單元格,它可以工作,但沒有與我的第一個代碼結合使用,它崩潰了,因為數據太多。 這是我嘗試過的:

// Modify column E
var dataRange = spreadsheet.getDataRange().getValues();
  var colData = [];

  for (var i = 1; i < dataRange.length; i++) {
    colData.push(dataRange[i][0]);
  }
  for (var i = 0; i < colData.length; i++) {

    // Get column E
    var comments_cell = spreadsheet.getDataRange().getCell(i + 2, 5).getValue();

        // Append
          spreadsheet.getDataRange().getCell(i + 2, 5).setValue('<a href="' + comments_cell + '" target="_blank"><button type="button">Button</button></a>');
    }

這是我完整的修改后的腳本:

function myfunction() {
  var keywords = ["removedata1", "removedata2"]; //  filter the column "C".
  var csvUrl = "https://myurl";
  var csvContent = UrlFetchApp.fetch(csvUrl).getContentText();
  var csvData = Utilities.parseCsv(csvContent, ";");
  var root = DriveApp.getFoldersByName("Myfolder");
  while (root.hasNext()) {
    var folder = root.next();
    var files = folder.getFiles();
    while (files.hasNext()) {
      var spreadsheet = SpreadsheetApp.open(files.next());
      var name = spreadsheet.getName().toUpperCase();
      var values = csvData.reduce((ar, r) => {
        if (!keywords.some(e => r[2].toUpperCase().includes(e.toUpperCase())) && r.join("").toUpperCase().includes(name)) {
          ar.push(r);
        }
        return ar;
      }, []);
      if (values.length == 0) continue;
      var sheet = spreadsheet.getSheets()[0];
      var v = [["Column1", "Column2", "Column3", "Column", "Column5"], ...values.map(r => {
        r[4] = `<a href="${r[4]}" target="_blank"><button type="button">Voir l'offre</button></a>`;
        return r;
      })];
      sheet.clearContents().getRange(1, 1, v.length, v[0].length).setValues(v);
    }
  }
}

在您的腳本中, getValue()setValue()在循環中使用。 在這種情況下,處理成本會變高。 在您的腳本中,如何進行以下修改?

從:

// Modify column E
var dataRange = spreadsheet.getDataRange().getValues();
  var colData = [];

  for (var i = 1; i < dataRange.length; i++) {
    colData.push(dataRange[i][0]);
  }
  for (var i = 0; i < colData.length; i++) {

    // Get column E
    var comments_cell = spreadsheet.getDataRange().getCell(i + 2, 5).getValue();

        // Append
          spreadsheet.getDataRange().getCell(i + 2, 5).setValue('<a href="' + comments_cell + '" target="_blank"><button type="button">Button</button></a>');
    }

至:

// var spreadsheet = SpreadsheetApp.getActiveSheet(); // In order to use this in your script, please remove this line.
var [, ...dataRange] = spreadsheet.getDataRange().getValues();
var values = dataRange.map(r => [`<a href="${r[4]}" target="_blank"><button type="button">Button</button></a>`]);
spreadsheet.getRange(2, 5, values.length).setValues(values);
  • 運行此腳本時,將創建一個用於放入工作表的數組並將該數組放入工作表。 這樣,可以降低腳本的處理成本。

參考:

添加:

我認為當我看到您添加的腳本時,需要修改以降低流程成本。 那么,下面的修改呢?

修改后的腳本:

function myfunction() {
  var keywords = ["valuetoremove1", "valuetoremove2"]; //  filter the column "C".
  var csvUrl = "https://myurl";
  var csvContent = UrlFetchApp.fetch(csvUrl).getContentText();
  var csvData = Utilities.parseCsv(csvContent, ";");
  var root = DriveApp.getFoldersByName("Myfoldername");
  while (root.hasNext()) {
    var folder = root.next();
    var files = folder.getFiles();
    while (files.hasNext()) {
      var spreadsheet = SpreadsheetApp.open(files.next());
      var name = spreadsheet.getName().toUpperCase();
      var values = csvData.reduce((ar, r) => {
        if (!keywords.some(e => r[2].toUpperCase().includes(e.toUpperCase())) && r.join("").toUpperCase().includes(name)) {
          ar.push(r);
        }
        return ar;
      }, []);
      if (values.length == 0) continue;
      var sheet = spreadsheet.getSheets()[0];

      var v = [["Column1", "Column2", "Column3", "Column", "Column5"], ...values.map(([...r]) => {
        r[4] = `<a href="${r[4]}" target="_blank"><button type="button">Voir l'offre</button></a>`;
        return r;
      })];

      // Or, if the above modification was not useful, please test the following script instead of it.
      // var v = [["Column1", "Column2", "Column3", "Column", "Column5"], ...values.map(r => {
      //   const temp = r.slice();
      //   temp[4] = `<a href="${temp[4]}" target="_blank"><button type="button">Voir l'offre</button></a>`;
      //   return temp;
      // })];

      sheet.clearContents().getRange(1, 1, v.length, v[0].length).setValues(v);
    }
  }
}
  • 關於您的回復It means that one time the data is imported correctly but the E column is not being turned into a button and if I run the script again the E column is being turned into a button. ,當我測試這個腳本時,列“E”的值具有<a href="###" target="_blank"><button type="button">Voir l'offre</button></a>
    • 順便說一句,當我看到您的回復時, It means that one time the data is imported correctly but the E column is not being turned into a button and if I run the script again the E column is being turned into a button. 再次,我認為您可能想通過將 HTML 創建到單元格來放置一個按鈕。 如果我的理解是正確的,那是無法實現的,因為目前的規范。 所以,在這個修改中,我把超鏈接放到了“E”列?
    • 如果您想將<a href="###" target="_blank"><button type="button">Voir l'offre</button></a>之類的值放入“E”列,請修改r[4] = `=HYPERLINK("${r[4]}","Voir l'offre")`; r[4] = `<a href="${r[4]}" target="_blank"><button type="button">Voir l'offre</button></a>`; .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM