インポートHTMLスクリプトの一括処理

0
2021.12.27

大きな助けを得て、このスクリプトは下のリンクの2番目のテーブルを取り込むように動作しています。このテーブルは、1つ目のテーブルとは異なり、IMPORTHTMLではスクレイピングできません(レギュラーシーズンは動作しますが、プレイオフは動作しません)。

https://www.basketball-reference.com/players/c/curryst01/gamelog/2016

function myFunction() {
  const url = "https://www.basketball-reference.com/players/c/curryst01/gamelog/2016"; // This URL is from your question.
  const sheetName = "Sheet1";  // Please set the destination sheet name.

  const html = UrlFetchApp.fetch(url).getContentText();
  const tables = [...html.matchAll(/<table[\s\S\w]+?<\/table>/g)];
  if (tables.length > 2) {
    const ss = SpreadsheetApp.getActiveSpreadsheet();
    Sheets.Spreadsheets.batchUpdate({ requests: [{ pasteData: { html: true, data: tables[8][0], coordinate: { sheetId: ss.getSheetByName(sheetName).getSheetId() } } }] }, ss.getId());

    Sheets.Spreadsheets.batchUpdate({ requests: [{ pasteData: { html: true, data: tables[7][0], coordinate: { sheetId: ss.getSheetByName(sheetName).getSheetId() } } }] }, ss.getId());
    
    
    return;
  }
  throw new Error("Expected table cannot be retrieved.");
}`enter preformatted text here`

さて、私はあと2つの問題を解決したいと思っています。

  1. このコードを微調整して、テーブル8と7の両方を一度にロードする方法はありますか?私のコードでは、テーブル8が読み込まれた後、テーブル7に置き換えられていると思います。これはbatchupdateのせいではないでしょうか?

  2. 一度に複数のURLをロードする方法はありますか?基本的には、このコードを複製して、50個のURLが一度にテーブルに読み込まれるようにしたいのです。

これまではimportHTML関数の束を使っていただけなのですが、PlayoffsテーブルがJavascriptのオブジェクトであるため、それを理解するのに苦労しています。

回答
1
2021.12.27

このコードはbatchUpdateを使用しているので、正しい道を進んでいると思います。JavaScriptでの配列の扱い方について、少し時間をかけて学ぶことをお勧めします。例えば、1つのに両方のリクエストオブジェクトを入れることができるので、2つのbatchUpdateを含める必要はなく、実際には1つのbatchUpdateに50個のpasteDataを含めることができます。

両方の「貼り付け」操作が機能していて、2番目の操作で1番目の操作が上書きされるという推測は正しいです。coordinateプロパティはsheetIdのみを指定し、rowIndexcolumnIndexプロパティは指定しないため、上書きされてしまいます。

置き換えてみてください。

Sheets.Spreadsheets.batchUpdate({ requests: [{ pasteData: { html: true, data: tables[8][0], coordinate: { sheetId: ss.getSheetByName(sheetName).getSheetId() } } }] }, ss.getId());

Sheets.Spreadsheets.batchUpdate({ requests: [{ pasteData: { html: true, data: tables[7][0], coordinate: { sheetId: ss.getSheetByName(sheetName).getSheetId() } } }] }, ss.getId());

Sheets.Spreadsheets.batchUpdate(
{ requests: [
{ pasteData: { html: true, data: tables[8][0], coordinate: { 
sheetId: ss.getSheetByName(sheetName).getSheetId(), 
rowId: 1,
columnId: 1
} } },

{ pasteData: { html: true, data: tables[7][0], coordinate: { 
sheetId: ss.getSheetByName(sheetName).getSheetId(),
rowIndex: 30,
columnIndex: 1
 } } }

] }, ss.getId()
);

完全なコードです。

function myFunction() {
  const url = "https://www.basketball-reference.com/players/c/curryst01/gamelog/2016"; // This URL is from your question.
  const sheetName = "Sheet1";  // Please set the destination sheet name.

  const html = UrlFetchApp.fetch(url).getContentText();
  const tables = [...html.matchAll(/<table[\s\S\w]+?<\/table>/g)];
  if (tables.length > 2) {
    const ss = SpreadsheetApp.getActiveSpreadsheet();
    Sheets.Spreadsheets.batchUpdate({
      requests: [
        {
          pasteData: {
            html: true, data: tables[8][0], coordinate: {
              sheetId: ss.getSheetByName(sheetName).getSheetId(),
              rowIndex: 1,
              columnIndex: 1
            }
          }
        },
        {
          pasteData: {
            html: true, data: tables[7][0], coordinate: {
              sheetId: ss.getSheetByName(sheetName).getSheetId(),
              rowIndex: 30,
              columnIndex: 1
            }
          }
        }
      ]
    }, ss.getId());


    return;
  }
  throw new Error("Expected table cannot be retrieved.");
}

リソース