2022年2月12日土曜日

AdSenseのデータをスプレッドシートに書き込むスクリプト

以下のスクリプトを実行するとAdSenseのデータをスプレッドシートに取り込みます。 未取得分だけを取得して追加するので、時間駆動のトリガで1時間おきにでも実施するのが良いです。 取り込んだデータはスプレッドシート側でデータ集計したり、グラフを作成してください。
function myFunction() { // 1時間おきのトリガを設定したい場合はこちらを実行
  trigger = ScriptApp.newTrigger("report")
  .timeBased()
  .everyHours(1)
//  .everyMinutes(5)
  .create();
  report();
}

function report() {
  var adsenseClientID = 'ca-pub-NNNNNNNNNNNNNNNN';
  var adsenseAccounts = 'pub-NNNNNNNNNNNNNNNN';
  var metrics = ['ESTIMATED_EARNINGS', 'PAGE_VIEWS', 'CLICKS', 'PAGE_VIEWS_CTR', 'COST_PER_CLICK', 'PAGE_VIEWS_RPM'];
  var sheetName = 'report';
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetName);
  if (sheet == null) {
    sheet = ss.insertSheet(sheetName);
  }

  const today = new Date();
  var lastRow = sheet.getLastRow();
  if (lastRow < 2) {
    var last = new Date('1900/1/1');
    sheet.getRange(1, 1, 1, metrics.length+1).setValues([['Date'].concat(metrics)]);
    lastRow = 2;
  }
  else {
    var last = new Date(sheet.getRange(sheet.getLastRow(), 1).getDisplayValue());
  }

  var report = AdSense.Accounts.Reports.generate(
    'accounts/'+adsenseAccounts,
    {
      // Specify the desired ad client using a filter.
      filters: ['AD_CLIENT_ID=='+adsenseClientID],
      metrics: metrics,
      dimensions: ['DATE'],
      dateRange: 'CUSTOM',
      'startDate.year': last.getFullYear(),
      'startDate.month':last.getMonth() + 1,
      'startDate.day':last.getDate(),
      'endDate.year': today.getFullYear(),
      'endDate.month':today.getMonth() + 1,
      'endDate.day':today.getDate(),
      // Sort by ascending date.
      reportingTimeZone: 'ACCOUNT_TIME_ZONE',
      orderBy: ['+DATE']
    } );

  sheet.getRange(lastRow, 1, report.rows.length, report.rows[0].cells.length)
    .setValues(report.rows.map(row => row.cells.map(cell => cell.value)));
}

Reports.generate関数はヘルプ(Method: accounts.reports.generate)を、metricsやdimensionsに指定する値はヘルプ(Metrics and Dimensions)を参照してください。

2022年2月7日月曜日

厚生労働省のオープンデータから新規陽性者数の推移(日別)を取得してスプレッドシートに書き込むスクリプト

厚生労働省のオープンデータから新規陽性者数の推移(日別)を取得してスプレッドシートに書き込む処理を毎日行うGoogle Apps Script

function myFunction() {
  trigger = ScriptApp.newTrigger("scraping")
  .timeBased()
  .everyDays(1)
  .create();
  scraping();
}
  
function scraping() {
  var content = UrlFetchApp.fetch("https://covid19.mhlw.go.jp/public/opendata/newly_confirmed_cases_daily.csv").getContentText();
  var values = Utilities.parseCsv(content);
  var sheet = SpreadsheetApp
            .getActiveSpreadsheet()
            .getSheetByName('シート1');
  sheet.getRange(1, 1, values.length, values[0].length).setValues(values);  
}

2022年2月6日日曜日

GoogleAppsScriptを使用しHTML内のテーブルをスプレッドシートに書き込む

Googleドライブの特定のフォルダに格納されているHTMLファイルの中に記載されているテーブルをスプレッドシートに書き込むスクリプト

どんな利用シーンがあるか分かりませんが、知恵袋で質問があったので作成してみた。なにかのツールが吐き出す結果のHTMLファイルにテーブルが含まれていて、その結果をシートにまとめたいという要望だと思う。

まったく同じようなシーンはあまり考えにくいが、何かの役に立つかもしれないので自分用のメモ代わりに残しておく。

6分越え対策やテーブルタグ(<tr>や<td>)内のデータ抽出などもふくめてエラー処理などかなり雑です、コメントで指摘してくれたら修正するかもしれません。


ソースコード

function myFunction() {
  // HTMLファイルが格納されているフォルダ階層を配列形式で指定する。
  // マイドライブ/AAA/BBB/ フォルダを指定するときは["AAA","BBB"]と指定する。
  var srcFolder = getFolder( null,["GoogleAppsScript","dev","HTML内の表を抜き出す","未処理"]);
  // HTMLファイルが格納されているフォルダ階層を配列形式で指定する。
  var dstFolder = getFolder( null,["GoogleAppsScript","dev","HTML内の表を抜き出す","処理済み"]);

  // スプレッドシートの指定は環境に合わせてください。
  var sheet = SpreadsheetApp
            .getActiveSpreadsheet()
            .getSheetByName('シート1');

  // スプレッドシートに書き込む二次元配列
  var table = [];

  // 一気に処理すると6分で終わらないので適当な回数で区切る。
  // 数が多いときは時間主導のトリガで繰り返し実行するとよい。
  var numberOfFiles = 50;

  var htmlFiles = srcFolder.getFiles();
  while (htmlFiles.hasNext()) {
    // 指定したファイル数の処理が完了したら抜ける。
    numberOfFiles--;
    if( numberOfFiles < 0 ){
      break;
    }

    var file = htmlFiles.next();
    var text =  file.getBlob().getDataAsString();
    
    // ここからが必要なデータの取り出しとシートへの貼り込み
    // <tr></tr>の抜き出して1行分を取り出す。
    var rows = text.match(/<tr(?:\s.+?)?>.*?<\/tr\s*?>/gis);
    for( var r=0; r<rows.length; r++ )
    {
      // 1行分の配列
      var arrayCols = [];
      // <th></th>もしくは<td></td>を抜き出す。
      var cols = rows[r].match(/(<th(?:\s.+?)?>.*?<\/th\s*?>)|(<td(?:\s.+?)?>.*?<\/td\s*?>)/gis);
      for( var c=0; c<cols.length; c++ )
      {
        // <th>,</th>,<td>,</td>を削除して配列に格納する
        arrayCols.push( cols[c].replace(/^(<(td|th)(?:\s.+?)?>)|(<\/(td|th)\s*?>$)/ig,""));
      }
      // 1行分の配列を追加
      table.push(arrayCols);
    }
    // 処理が完了したファイルは処理済みフォルダに移動
    file.moveTo( dstFolder );
  }
  // ファイル移動と書き込みは同じ場所が理想
  // 処理高速化を考えてファイル移動はループ内
  // スプレッドシートへの書き込みはループの外に移動
  sheet.getRange(sheet.getLastRow()+1,1,table.length,table[0].length).setValues(table);
}


/**
 *  指定されたフォルダ取得する、フォルダがないときは新規に作成する。
 *
 *  @param {Folder} parent 基準フォルダ、null指定時はルートフォルダ
 *  @param {string|Array of strings} name 取得・生成するフォルダ名
 *      string 指定時はnameを取得。生成する
 *      Array of strings 指定時は多階層フォルダを一括作成
 *  @param {bool} noCreate 作成は行わず既存のフォルダを取得するときにtrue
 *      省略可能、省略時はfalseとして動作
 *  @return {Folder|undefined} 取得・生成したフォルダ
*/
function getFolder( parent, name, noCreate ) {
  // 親フォルダが指定されなかった場合はルートフォルダを取得する。
  if ( parent == null ){
    var folder = DriveApp.getRootFolder();
  }else{
    var folder = parent;
  }
  // フォルダ名に配列が指定されていない場合は配列にする。
  if( !Array.isArray( name ) ){
    name = [name];
  }
  // noCreateが指定されていない場合はfalseにする。
  if ( noCreate !== true ){
    noCreate = false;
  }

  while( name.length > 0 ){
    var newFolder = name.shift();
    var childs = folder.getFoldersByName( newFolder );
    if( childs.hasNext() ){
      // フォルダが見つかった場合は最初のフォルダを採用
      folder = childs.next();
    } else {
      if( noCreate ){
        // noCreateの場合はnullを返す
        return undefined;
      }else{
        // フォルダが見つからなかった場合はフォルダを作成
        folder = folder.createFolder( newFolder );
      }
    }
  }
  return folder;
}

1つ目のHTMLファイル

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>ひこざるさん</title>
</head>
<body>
    <a href="https://blog.hikozaru.com">ひこざるさんのブログ</a>
    <table border="1">
      <tr>
        <th>XXX</th>
        <th>YYY</th>
        <th>zzz</th>
      </tr>
      <tr>
        <td>111X</td>
        <td>111Y</td>
        <td>111Z</td>
      </tr>
    </table>
</body>
</html>

2つ目のHTMLファイル

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>ひこざるさん</title>
</head>
<body>
    <a href="https://blog.hikozaru.com">ひこざるさんのブログ</a>
    <table border="1">
      <tr>
        <th>XXX</th>
        <th>YYY</th>
        <th>zzz</th>
      </tr>
      <tr>
        <td>222X</td>
        <td>222Y</td>
        <td>222Z</td>
      </tr>
    </table>
</body>
</html>

実行結果

2022年2月5日土曜日

部活で共有しているアカウントにプライベート写真がアップロードされたかもしれない場合

部活、サークル、職場などの共有アカウントのGoogleフォト写真が登録されてしまって、皆に見られているかもしれない。という質問は結構多い。

根本的にアカウントを共有するのが大変危険です。その際の対処を書きますので、以下の順番で確認および対応を行ってください。

1.スマホのGoogleフォトアプリの設定を確認


Googleフォトアプリの右上のアカウントアイコンをタップしてください。
「フォトの設定」⇒「バックアップと同期」画面に遷移して「バックアップアカウント」を確認してください。
そのアカウントが共有アカウントだとしたらヤバいです、その画面で「バックアップと同期」をオフするか、プライベートアカウントに切り替えてください。

2.他の人が見える画像を確認


スマホのSafariブラウザのプライベートタブやChromeブラウザのシークレットモードでGoogleフォトWEB版(https://photos.google.com/login)に共有アカウントでログインしてください。
プライベートタブやシークレットモードでアクセスしないと別の問題が発生するので、もしわからなければWEBで調べてください。
GoogleフォトWEB版でのアクセスに成功すると左上が「≡」アイコンになっています。
そこで表示されている画像が、共有アカウントにログインできる人が閲覧可能な画像です。そこに画像が表示されていたら次の手順に進んでください。

3.公開されてしまった画像を削除


上の1.と2.の手順を実施してから本手順を実施してください。
手順2.と同じ手順でGoogleフォトWEB版(https://photos.google.com/login)に共有アカウントでログインしたらプライベート画像をゴミ箱アイコンでゴミ箱に入れてください。
ゴミ箱から完全に削除する前に端末に画像が残っているか確認してください。
確認はGoogleフォトアプリ以外のgallery goなど端末のデータを閲覧するアプリで行ってください。
端末から削除されていないことを確認したらGoogleフォトWEB版で「≡」⇒「ゴミ箱」に行き、ゴミ箱を空にしてください。

2022年1月25日火曜日

Googleフォトのデータを削除して容量を空ける

以下に該当する画像は容量を消費してないので削除しても空き容量は増えません。

 ①2021/5/31までに高画質設定でバックアップした画像 
 ②2021/5/31までに容量を解放を実施した場合は、実施前にバックアップした画像 
③2022/1/31までにpixel3からバックアップした画像 
④pixel5までのpixelシリーズのGoogleフォトアプリで節約画質(旧 高画質)設定でバックアップした画像 
⑤パートナー共有された画像を自分のライブラリに保存した画像(これが容量カウントされないのはバグだと思います、ある日突然容量消費する可能性が有ります) 
⑥バックアップされていないロックされたフォルダ(ロック中フォルダ)内の画像
⑦以下の場所に表示されていない画像
 フォト

上記に該当しない画像を消すと空き容量が増えます。上記に該当する写真を消すと空き容量が増えてしまうこともあります。

なお、削除に関しては https://blog.hikozaru.com/2019/11/GooglePhotosDelete.html の2-1や2-2を参照下さい。

また、ゴミ箱に入れた時点で空き容量が増えるので焦って完全に削除しないようにしてください。

もう少し簡単に言うと以下の赤で示すように「バックアップ済み」の画像のうち、緑で示すような「お使いのアカウントの保存容量は使用されません。」が表示されていない画像を削除する必要があります。



2022年1月16日日曜日

JavaScriptのforEachが良く分からないという質問に対する回答

for( var i=0; i<array.length; i++){console.log(array[i];}は理解しているけど、
array.forEach(element => {console.log(element);});はよくわからないという方向けの説明です。
forEach の書き方は検索すれば大量にヒットするのですが、それでもこの書式の意味が良く分からないという方は一定数いるのではないでしょうか。ヤフー知恵袋でまさにその質問があったので回答してみたのでその紹介です。
質問内容としては以下です。
forEachメソッドについて
const numbers=[1,2,3];
numbers.forEach((number) =>{console.log(number);});
ここの引数の使い方がいまいち理解できません。
numberが定義されていないのになぜこれでちゃんと出力されるのですか?
私が初めてこの書き方を見たときと同じ疑問です。
forEachの構文や正確な情報は MDN Web DocsのArray.prototype.forEach()の説明 などを見ていただければよいかと思います。
今回は for を forEach に書き換えていくことで構文を覚えるのではなく、理解するということを目指していく。

①forを用いた記述

これが分からない人は、ごめんなさいこれ以上読み進めても意味がないです。
function test()
{
  var array=[1,2,3,4,5];
  for( var i=0; i < array.length; i++ )
  {
    console.log( array[i] );
  }
}

②forの処理を関数化

function hogehoge( number )
{
  console.log( number );
}

function test()
{
  var array=[1,2,3,4,5];
  for( var i=0; i < array.length; i++ )
  {
    hogehoge( array[i] );
  }
}

③コールバック関数風に書き換え

あまり利点はないですが説明のための変形です。
function hogehoge( number )
{
  console.log( number );
}

function test()
{
  var array=[1,2,3,4,5];
  var callbackFunction = hogehoge;
  for( var i=0; i < array.length; i++ )
  {
    callbackFunction( array[i] );
  }
}

④for文自体を関数化

forEach風の関数を作成します。
function hogehoge( number )
{
  console.log( number );
}

function forEachFunction( array, callbackFunction )
{
  for( var i=0; i<array.length; i++)
  {
    callbackFunction( array[i] );
  }
}

function test()
{
  var numbers=[1,2,3,4,5];
  forEachFunction( numbers, hogehoge );
}

⑤forEachに書き換える

forEach風の関数をforEachに書き換えます。
function hogehoge( number )
{
  console.log( number );
}

function test()
{
  var numbers=[1,2,3,4,5];
  numbers.forEach( hogehoge );
}

⑥forEachの中で関数を定義する

forEachのたびに別関数を作ると読みにくくなるので、関数定義しつつコールバック関数登録します。
function test()
{
  var numbers=[1,2,3,4,5];
  numbers.forEach(
    function hogehoge(number){console.log(number);}
  );
}

⑦アロー関数で定義する

関数定義をアロー関数に書き換えます。
function test()
{
  var numbers=[1,2,3,4,5];
  numbers.forEach(
    number=>{console.log(number);}
  );
}

●アロー関数は以下を見てください。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions

2022年1月15日土曜日

Googleフォトに写真が見当たらない場合

写真が見当たらない場合や、機種変更時にGoogleフォトにバックアップした(つもり)のに新端末のGoogleフォトアプリに写真が表示されない時の対処をまとめた。



考えられる原因は2つです。

  • バックアップできていなかった 
    • Googleフォトアプリに表示されていてもバックアップできているとは限りません。そこを勘違いする人が多いです。
    • Googleフォトをインストールしてもバックアップには時間がかかります、1日15GBまでしかバックアップできないので100GBとか保存している場合には1週間くらいかかります。「携帯ショップで作業してくれた」という状況の場合はバックアップできてない可能性が高いです。
  • アカウントが違う
どちらにしても以下の手順で確認してください。

1.アカウントを確認する

 Googleフォトはアカウント毎にデータを保管しています。アカウントが異なると画像は閲覧できません。アカウントを一つしかもっていないと思っていても意図せず複数のアカウントを所有している人も多いので以下の確認をしてください。

所有しているアカウントすべてを確認:

以下のヘルプに従い所有しているアカウントすべてを確認してください 
存在するアカウントについて確認する(https://support.google.com/accounts/answer/40560?hl=ja) 

旧端末が手元にある場合:

旧端末が手元にある場合は念のため、旧端末のGoogleフォトアプリで右上のアカウントアイコンから「フォトの設定」→「バックアップと同期」と進みバックアップ先のアカウントを確認してください。

2.WEB版のGoogleフォトでデータを確認する

Androidの場合:

Chromeブラウザのシークレットモードで https://photos.google.com/login にログインして画像を確認してください。
左上の「≡」アイコンから、「フォト」「アーカイブ」「ゴミ箱」「設定➜サポートされていない動画」の四か所を確認してください。
複数のアカウントを所有している場合には、すべてのアカウントでログインしてください。別のアカウントでログインする場合には一旦タブを閉じて新しいタブで同様にログインしなおしてください。

iPhoneの場合:

Safariブラウザのプライベートタブで https://photos.google.com/login にログインして画像を確認してください。 
左上の「≡」アイコンから、「フォト」「アーカイブ」「ゴミ箱」「設定➜サポートされていない動画」の四か所を確認してください。
複数のアカウントを所有している場合には、すべてのアカウントでログインしてください。別のアカウントでログインする場合には一旦タブを閉じて新しいタブで同様にログインしなおしてください。

ログインできない場合:

以下を参考にログインを試みてください。 

3.アルバムアーカイブでデータを確認する(この機能はなくなってしまいました)

Androidの場合:

Chromeブラウザのシークレットモードで https://get.google.com/albumarchive/ にアクセスして画像を確認してください。
左上の「≡」アイコンから、「フォト」「アーカイブ」「ゴミ箱」の三か所を確認してください。
複数のアカウントを所有している場合には、すべてのアカウントでログインしてください。別のアカウントでログインする場合には一旦タブを閉じて新しいタブで同様にログインしなおしてください。

iPhoneの場合:

Safariブラウザのプライベートタブで https://get.google.com/albumarchive/ にアクセスして画像を確認してください。 
左上の「≡」アイコンから、「フォト」「アーカイブ」「ゴミ箱」の三か所を確認してください。
複数のアカウントを所有している場合には、すべてのアカウントでログインしてください。別のアカウントでログインする場合には一旦タブを閉じて新しいタブで同様にログインしなおしてください。

4.Googleフォトでデータが見つからない場合/データが足りない場合

旧端末が手元にある場合:

以下のヘルプを参考に旧端末でバックアップを行ってください。Androidの場合はデバイスのフォルダをバックアップする方法の説明もよく読んでください。

写真や動画をバックアップする (https://support.google.com/photos/answer/6193313?hl=ja)

容量が不足していると 中途半端にしかバックアップできません、以下でバックアップ先アカウントの容量を確認してください。空き容量がない場合はGoogle Oneに加入し必要な容量を購入してください。 

https://one.google.com/storage 

 

なお、旧端末から写真を消してもよい場合には以下の方法で確実にバックアップすることをお勧めします。

機種変更時に写真をGoogleフォトにBackupする方法(https://blog.hikozaru.com/2018/04/iphonegooglebackup.html)

旧端末が手元にない場合:

バックアップできていなかった可能性もあります、その場合はGoogleフォトからの復元は無理です。アカウントが違う可能性もあるので最初の手順から繰り返してください。

2022年1月3日月曜日

GoogleフォトのHEIC画像をJPGでダウンロードするオプション

 iPhoneで撮影したHEIC画像をGoogleフォトにバックアップしWEB素材で使用する際にHEICからJPGへの変換が必要になる。私は別の用途だったのでこのオプションは使えないと思い込んでいましたが、人によっては有用ということが分かったので説明します。

Googleフォト上で画像を編集してからダウンロードするとJPGに変換できるが、編集するのは少し気持ち悪いし手間がかかる。

パソコンでダウンロードするときにJPEGでダウンロードするオプションを紹介する、といってもGoogleが公式に公開しているBase URLsのドキュメント通りにオプションを設定するだけ。注意事項としては位置情報が消されるということですが、WEB素材で使用する場合などはかえって都合がよいのではないでしょうか。

手順

  1. GoogleフォトでHEIC画像を表示する。
  2. 画像を右クリックして「新しいタブで画像を開く」を行う。
  3. 新しいタブのURLの末尾を確認する。
  4. 末尾のオプションを変更してJPGファイルをダウンロードする。
    ”=wXXX-hYYY-no?” ⇒ "=d?" と書き換えるだけです。

おまけ

  • iPhoneでHEICからJPEGに変換する場合は「ショートカット」アプリで作成した以下のショートカットをGoogleフォトアプリから呼び出す。

  • iPhoneのブラウザでGoogleフォトにアップロードするとHEICがJPEGに変換される
  • iPhoneのカメラプリの設定でJPEGで保存する設定がある(実は私はJPG保存設定です。)

2021年12月29日水曜日

GoogleフォトのデータをダウンロードしてGoogleフォトから画像を削除する方法

手順1:画像をロックされたフォルダに移動

Geegleのフォトアプリで画像を選択し、画面右上の「⋮(その他のオプション)」から「ロックされたフォルダに移動」を選択する。全画像を「ロックされたフォルダに移動」する。


手順2:バックアップと同期をオフ

Geegleのフォトアプリ画面右上のアカウントアイコンをタップし「⚙フォトの設定」→「バックアップと同期」画面に遷移して「バックアップと同期」をオフにする


手順3:ロックされたフォルダから取り出す

Geegleのフォトアプリ画面右下の「ライブラリ」→「ユーティリティ」→「ロックされたフォルダ」で画像を選択し、「移動」する。


手順4:確認項目

以下を確認し、作業不足がないかを確認する。

  • ロックされたフォルダに画像が残っていないことを確認する
  • Googleフォト以外のアプリ(例えばGallery Goなど)でデバイスに写真が残っていることを確認する
  • ChromeブラウザのシークレットモードでGoogleフォトWEB版( https://photos.google.com/login )にアクセスして「≡」→「フォト」、「≡」→「アーカイブ」、「≡」→「ゴミ箱」に写真が残っていないことを確認する

手順5:(もしGoogleフォトを辞める場合)Googleフォトアプリのアンインストール

Googleフォトアプリをアンインストールや無効化を行う。
もしくはGeegleのフォトアプリ画面右上のアカウントアイコンをタップし、表示されたメニューのアカウントアイコンの右側をタップし、「アカウントなしで使用」を選択する。

2021年12月12日日曜日

Googleフォトのアルバムをまとめてダウンロードする

Googleフォトで作成したアルバムを一括で端末にダウンロードする方法がわかりにくいのでまとめてみる。

流れとしては以下のようになります。

似たような内容ですが目的によっては以下もあります。
AndroidでGoogleフォトの画像をまとめてダウンロード
Googleフォトの写真をまとめてAndroid端末にダウンロードする方法(すべてをダウンロード)
Googleフォトの写真をまとめてAndroid端末にダウンロードする方法(選択してダウンロード)

それぞれの手順を詳しく説明します。

1.アルバムデータをZIP形式でダウンロード

1-1もしくは1-2のどちらかを実施して下さい。

1ー1.ブラウザ版Googleフォトでダウンロード

ブラウザでGoogleフォトのアルバム(https://photos.google.com/albums)にアクセスし、ダウンロードしたいアルバムを開き、画面右上の「⋮(その他のオプション)」をタップやクリックして「すべてをダウンロード」する。
  

なお、写真2枚のアルバムをダウンロードした際のZIPファイル内には以下のような構造になっている。

D:\Download>tree /f /a テスト-001
フォルダー パスの一覧:  ボリューム Data
ボリューム シリアル番号は 00000038 XXXX:YYYY です
D:\DOWNLOAD\テスト-001
\---テスト
        PXL_20211017_085426599.jpg
        PXL_20211204_025812539.PORTRAIT_Original.jpg
  

1-2.GoogleTakeoutでダウンロード

①GoogleTakeoutにアクセスし選択をすべて解除する

Googleデータエクスポート(https://takeout.google.com/)にアクセスし「選択をすべて解除」する。

②Googleフォトを選択してしばらく待つ

画面をスクロールしGoogleフォトを探しチェックを入れる。「≡すべてのフォトアルバムが含まれます」というボタンが表示されていない場合はそのまま表示されるまで待つ。データが多いアカウントだと表示まで時間がかかるので1分くらい待つ。

③ダウンロードするアルバムを選択する

「≡すべてのフォトアルバムが含まれます」をクリックし、ダウンロードするアルバムを選択しOKを押す。

 

④次のステップに進む

画面を一番下までスクロールし「次のステップに進む」

⑤ファイル形式、エクスポート回数、エクスポート先の選択を選択

エクスポート設定を確認し「エクスポート作成」を行う。

配信方法タウンロードリンクをメールで送信
頻度1回エクスポート
ファイルの形式とサイズ.zip / 2GB

⑥ダウンロードの実施

エクスポートの準備が終わるとメールが届くのでメールのリンクをクリックしてもよい。メールのリンクをクリックするのが怖い人は、「エクスポートの管理」(https://takeout.google.com/takeout/downloads?hl=ja)にアクセスしてもよい。エクスポートの準備ができていたらダウンロードボタンが表示されているのでそれをクリックしてダウンロードする。

なお、GoogleTakeoutの詳細についてはヘルプの「Google データをダウンロードする方法」を見てください。気にある注意事項は以下のダウンロード期限とダウンロード回数です、ダウンロード期限はエクスポートの準備が完了してからではなく、エクスポート操作を行ってから七日間です。データが多い場合にはエクスポートの準備に5日とか6日かかるのでダウンロード期限までにダウンロードできない、その場合は一気にアルバムを分けるなど工夫が必要になる。
アーカイブが期限切れになるのはなぜですか?
アーカイブは 7 日程度で期限切れになります。その期間が経過した後には、最新の情報で新しいアーカイブを作成することをおすすめします。
アーカイブが期限切れになってもデータが期限切れになるわけではありません。また、ユーザーの Google サービスの利用にも変更はありません。
  注: 各アーカイブのダウンロードは 5 回までに制限されています。それ以上は別のアーカイブをリクエストしてください。

なお、写真2枚のアルバムをダウンロードした際のZIPファイル内には以下のような構造になっている。

D:\Download>tree /f /a takeout-20211211T082208Z-001
フォルダー パスの一覧:  ボリューム Data
ボリューム シリアル番号は 00000045 XXXX:YYYY です
D:\DOWNLOAD\TAKEOUT-20211211T082208Z-001
\---Takeout
    |   アーカイブ概要.html
    |
    \---Google フォト
        \---テスト
                PXL_20211017_085426599.jpg
                PXL_20211017_085426599.jpg.json
                PXL_20211204_025812539.PORTRAIT_Original.jpg
                PXL_20211204_025812539.PORTRAIT_Original.jpg.json
                メタデータ.json

jsonファイルには写真の付帯情報が記録されている。

D:\Download>type "TAKEOUT-20211211T082208Z-001\Takeout\Google フォト\テスト\PXL_20211017_085426599.jpg.json"
{
  "title": "PXL_20211017_085426599.jpg",
  "description": "",
  "imageViews": "15",
  "creationTime": {
    "timestamp": "1639210041",
    "formatted": "2021/12/11 8:07:21 UTC"
  },
  "photoTakenTime": {
    "timestamp": "1634460866",
    "formatted": "2021/10/17 8:54:26 UTC"
  },
  "geoData": {
    "latitude": 0.0,
    "longitude": 0.0,
    "altitude": 0.0,
    "latitudeSpan": 0.0,
    "longitudeSpan": 0.0
  },
  "geoDataExif": {
    "latitude": 0.0,
    "longitude": 0.0,
    "altitude": 0.0,
    "latitudeSpan": 0.0,
    "longitudeSpan": 0.0
  },
  "url": "https://lh3.googleusercontent.com/v2aEwCGRMrc3Iq0eJECqrtyWpVWgz4fYP0XeTGLfF8wr55lZhDh_7NIlrck9u00Ob9GDWQfXney4y6tPx8F2Bc61vpZ6Big_AM7isljj",
  "googlePhotosOrigin": {
    "fromSharedAlbum": {
    }
  },
  "photoLastModifiedTime": {
    "timestamp": "1639210344",
    "formatted": "2021/12/11 8:12:24 UTC"
  }
}

構造を見て、同じ名前のアルバムがあるとどうなるか気になりますね、ということで試した結果が以下です。同名別アルバムがあると同じフォルダに統合されてしまいごちゃまぜフォルダになるようです。

D:\Download>tree /f /a takeout-20211212T044840Z-001
フォルダー パスの一覧:  ボリューム Data
ボリューム シリアル番号は 0000006D XXXX:YYYY です
D:\DOWNLOAD\TAKEOUT-20211212T044840Z-001
\---Takeout
    |   アーカイブ概要.html
    |
    \---Google フォト
        \---テスト
                PXL_20210721_071037766.jpg
                PXL_20210721_071037766.jpg.json
                PXL_20210721_071053099.jpg
                PXL_20210721_071053099.jpg.json
                PXL_20210721_071101814.jpg
                PXL_20210721_071101814.jpg.json
                PXL_20211017_085426599.jpg
                PXL_20211017_085426599.jpg.json
                PXL_20211204_025812539.PORTRAIT_Original.jpg
                PXL_20211204_025812539.PORTRAIT_Original.jpg.json
                メタデータ(1).json
                メタデータ.json

2.ZIPファイルから画像ファイルを取り出す

Zipファイルから画像を取り出す方法はGoogleで検索すれば出てくるので基本的に省略するが、Androidではこの記事(https://blog.hikozaru.com/2019/11/PhotosAllDownloadAndroid.html#p04)を参考にして欲しい。Windowsパソコンの場合にはZIPファイルを右クリックして「すべて展開」を選択してください。